我的代码:
parent(pamela, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, patricia).
parent(patricia, jim).
grandparent(X, Y) :- parent(X, Z), parent(Z, Y).
% Кто прародители Патриции?
query(X) :- grandparent(X, patricia).
在在线翻译器(链接)中,我提出了一个要求:
query(X).
作为回应,我得到:
X = pamela
迷路的汤姆。如何让它显示所有的祖父母?
在与 Prolog 推理引擎对话的过程中,通过传递字符 可以得到下一个找到的解
;。在此编辑器中,在输入字段中,您需要在输入字段中放置;下一行并通过单击按钮重新开始输出Run it [F8]。因此,如果输入字段如下所示:那么系统的响应将是
第一次找到结果
pamela,第二次tom,第三次找不到新的解决方案,序幕会响应false。通常在一个问题中,需要找到所有可能的解决方案,而不是在与系统的对话过程中,而是直接在推理过程中。在这种情况下,使用内置谓词
bagof之一setoforfindall。谓词
bagof(X, P, L)生成一个列表L,其中包含所有X为P真的对象。也就是说,如果在这个例子中我们问答案是
但是如果你没有指定 的确切值
patricia,那么 Prolog 将找到所有解对并形成相应的列表。问题我们会得到答案
在 SWI-Prolog 中,相同的答案将更具描述性:
谓词
setof是相似bagof的,但结果列表将被排序并且不包含重复项(如果有)。让我们稍微改变一下原来的例子,看看它们之间的区别(交换前两个谓词):然后
输出结果
在第一个列表中
tom并且pamela不是按字母顺序排列的,但是显示
谓词
findall(X, P, L)生成L所有X可以推断出目标的列表P。该列表L可能包含重复项。要求在问题的原始示例上将显示
Child如果你设置了确切的值而不是变量,那么bagof和之间没有区别findall(SWI-Prolog,在retexter解释器中,你需要去掉提示?-)如果要得到一个
L与谓词列表等价的列表findall,但不包含重复元素,可以使用^谓词中的操作setof(X, P, L)。这个操作告诉Prolog我们对目标中包含的变量之一的值不感兴趣P(SWI-Prolog,在retexter解释器中,我们需要去掉提示?-):添加,写(X),nl,失败。在请求结束时。
查询(X)。问题
帕梅拉
汤姆
假的。