我正在使用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中执行此操作? 提前谢谢。
答案 0 :(得分:1)
在GNU Prolog中,当end_of_term(eof)
选项传递给read_term_from_atom
时,您可以避免最后一个点。 。E.g,:
| ?- 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对应于原子的字符串表示的当时。
在某些情况下,这可以简化事情。
答案 1 :(得分:0)
这里有一个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
请注意,您应该更改query / 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) )
)).
我从this回答中得到提示。