Как распечатать результаты унификации при использовании пролог-скрипта?
Я использую скрипт пролога для выполнения всех запросов, код выглядит так:
:- initialization(run).
writeln(T) :- write(T), nl.
queryAll :-
forall(query(Q), (Q ->
writeln('yes':Q) ;
writeln('no ':Q))).
run :-
queryAll,
halt.
query( (1,2,3) = (X,Y,Z) ).
проблема в том, что queryAll
будет только печатать "да" или "нет", пока я хочу увидеть результаты объединения, как:
X = 1
Y = 2
Z = 3
Как это сделать в прологе? Заранее спасибо.
2 ответа
Вот пример встроенных функций gprolog, которые могут быть полезны для улучшения работы ваших клиентов:
| ?- read_term_from_atom('X+Y = 1+2.', T, [variable_names(L)]).
L = ['X'=A,'Y'=B]
T = A+B=1+2
yes
| ?- read_term_from_atom('X+Y = 1+2.', T, [variable_names(L)]),call(T).
L = ['X'=1,'Y'=2]
T = 1+2=1+2
Обратите внимание, что вы должны изменить содержимое запроса /1: вместо
query( (1,2,3) = (X,Y,Z) ).
должно быть
query( '(1,2,3) = (X,Y,Z).' ). % note the dot terminated atom
и тогда цикл может быть, например,
queryAll :-
forall(query(Q),
( read_term_from_atom(Q, T, [variable_names(L)]),
( T -> writeln('yes':L) ; writeln('no ':Q) )
)).
Я понял подсказку из этого ответа.
В GNU Prolog вы можете избежать финальной точки при передаче end_of_term(eof)
возможность read_term_from_atom
, Например,:
| ?- read_term_from_atom('X+Y = 1+2', T, [variable_names(L),end_of_term(eof)]).
L = ['X'=A,'Y'=B]
T = (A+B=1+2)``
Это означает, что когда встречается EOF (конец файла), он считается концом читаемого термина. При чтении из атома EOF соответствует тогда строковому представлению атома.
Это может упростить вещи в некоторых ситуациях.