动态查询prolog

时间:2016-08-30 15:25:21

标签: prolog swi-prolog

有没有办法动态查询序言知识库?

我在文件family.pl中有prolog逻辑(我在这里找到的一个例子http://www.techytalk.info/prolog-programming-gprolog-linux/)。以下是其内容:

mother_child(trude, sally).

father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).

sibling(X, Y)      :- parent_child(Z, X), parent_child(Z, Y).

parent_child(X, Y) :- father_child(X, Y).
parent_child(X, Y) :- mother_child(X, Y).

我希望能够在不进入prolog解释器的情况下进行查询。

此命令对我不起作用:

swipl -f family.pl -g "father_child(Father, Child)"

由于

1 个答案:

答案 0 :(得分:4)

查询 工作:如果以这种方式调用程序,则只是看不到结果。

因此,您可以自己打印结果,例如:

swipl -f family.pl -g "father_child(Father,Child), \
                       portray_clause(father_child(Father, Child))"

这会产生:

father_child(tom, sally).
?-

当然不是所有,所以你可以使用false/0强制回溯:

swipl -f family.pl -g "father_child(Father,Child), \
                       portray_clause(father_child(Father, Child)), \
                       false"

并产生:

father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).
?-

使用 -t halt 暂停该计划,而不是返回到顶层:

swipl -f family.pl -g "father_child(Father,Child), \
                       portray_clause(father_child(Father, Child)), \
                       false" -t halt

现在终于有了:

father_child(tom, sally).
father_child(tom, erica).
father_child(mike, tom).

P.S。:对于谓词来说,这是一个非常好的命名约定!