Есть ли вариант Пролога, который выбирает порядок целей в зависимости от данных? Пример.
code_rem(zero) --> [false].
code_rem(succ(zero)) --> [true].
code_n(zero) --> [false].
code_n(succ(N)) --> [true], {div_mod(N, succ(succ(zero)), Q, R)}, code_rem(R), code_n(Q).
code_n работает только как print. Если поменять порядок атомов:
code_n(succ(N
(
Read more... )
Comments 6
Reply
var(X) - не связана, nonvar(X) - связана.
Reply
Попробовал
code_n(succ(N)) --> [true], {when((nonvar(N); nonvar(Q)), div_mod(N, succ(succ(zero)), Q, R))}
, code_rem(R), code_n(Q).
в SWI-Prolog. Этот вариант зависает на parse, если code_n вызван >1 раза.
Reply
Простенький пример - решатель линейного уравнения A+B=C.
abc(A,B,C) умеет не только проверять, но и выводить значения.
:- initialization(run).
/* A + B = C */
abc(A,B,C) :- nonvar(A), nonvar(B), write('A+B '), !, C is A+B.
abc(A,B,C) :- nonvar(A), nonvar(C), write('C-A '), !, B is C-A.
abc(A,B,C) :- nonvar(B), nonvar(C), write('C-B '), !, A is C-B.
/* no idea how to solve */
abc(A,B,C) :- write('figvam '), fail.
writes([]) :- write('\n').
writes([X|Xs]) :- write(X), writes(Xs).
test(A,B,C) :-
writes(['start...']),
abc(A,B,C),
writes(['A=',A, ' B=',B, ' C=',C]);
writes(['failed.']).
run :-
test(1,4,_),
test(1,_,5),
test(_,4,5),
test(1,4,5),
test(1,2,10),
test(_,_,10),
test(_,10,_),
test(10,_,_).
Reply
Можно было добиться того же просто исчерпывающими проверками.
Больше того, кат нужен только в первой ветке.
Reply
Reply
Leave a comment