3

我正在使用 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

如何在序言中做到这一点?提前致谢。

4

2 回答 2

1

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

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

于 2013-01-21T09:16:57.063 回答
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) )
        )).

我从这个答案中得到了提示。

于 2013-01-19T17:12:25.290 回答