Как распечатать результаты унификации при использовании пролог-скрипта?

Я использую скрипт пролога для выполнения всех запросов, код выглядит так:

:- 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 соответствует тогда строковому представлению атома.

Это может упростить вещи в некоторых ситуациях.

Другие вопросы по тегам