Пролог, порядок целей в зависимости от данных

Jul 18, 2015 20:40

Есть ли вариант Пролога, который выбирает порядок целей в зависимости от данных? Пример.

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... )

termination, prolog, parse

Leave a comment

Comments 6

nponeccop July 18 2015, 18:18:26 UTC
В прологе вроде обмазывание катом (!) - лекарство от всего.

Reply


kodt_rsdn July 18 2015, 19:30:16 UTC
В GNU Prolog есть предикаты, проверяющие - связана переменная или нет.
var(X) - не связана, nonvar(X) - связана.

Reply

beroal July 18 2015, 20:33:35 UTC
Я думаю, nonvar не годится. Тогда придётся писать 2 формулы для code_n(succ(N)), а это дублирование кода.

Попробовал

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


kodt_rsdn July 18 2015, 20:04:53 UTC
http://ideone.com/unyrAi
Простенький пример - решатель линейного уравнения 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

kodt_rsdn July 18 2015, 20:08:47 UTC
Да, забыл сказать, кат здесь нужен только для того, чтобы не спрыгнуть в ветку figvam, если все данные вычислены, но уравнению не удовлетворяют.
Можно было добиться того же просто исчерпывающими проверками.

Больше того, кат нужен только в первой ветке.

Reply


beroal August 3 2015, 05:59:00 UTC
updated

Reply


Leave a comment

Up