使用prolog脚本时如何打印统一结果?
我使用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只会
:- 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(最新版本)中方便地读取和写入变量名称。