使用prolog脚本时如何打印统一结果?

使用prolog脚本时如何打印统一结果?,prolog,gnu-prolog,unification,Prolog,Gnu Prolog,Unification,我使用prolog脚本执行所有查询,代码如下: :- 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只会

我使用prolog脚本执行所有查询,代码如下:

:- 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
如何在prolog中实现这一点?
提前感谢。

这里有一个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中,当将
术语结束(eof)
选项传递到
从原子读取术语时,可以避免最后一个点。例如:

| ?- 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对应于原子的字符串表示形式的then


在某些情况下,这可以简化事情。

如果我在gprolog中运行,在添加forall/2后,我会看到
yes:((1,2,3)=(1,2,3))
。您可以尝试
format('yes:~w~n',[Q])
而不是writeln(yes:Q),但似乎您还有其他问题。您需要查看变量名称吗?请注意,您可以使用选项
variable\u names/1
在GNU Prolog(最新版本)中方便地读取和写入变量名称。