如何不显示是否多次出现相同的结果 - Prolog

Anu*_*Anu 1 prolog swi-prolog

设想

我有如下代码。我的问题是如何不多次显示相同的结果。

male(charles).
male(andrew).
male(edward).

female(ann).

age(charles, 70).
age(ann, 65).
age(andrew, 60).
age(edward, 55). 

nextking(X) :- age(X,P), age(Y,Q),
               P>=Q, X\==Y;  age(X,55).
Run Code Online (Sandbox Code Playgroud)

电流输出

在此处输入图片说明

我需要的

我需要输出是查尔斯、安、安德鲁、爱德华。没有重复的名字。

Cap*_*liC 5

使用相当新的版本,您可以使用库(solution_sequences):

?- distinct(nextking(X)).
X = charles ;
X = ann ;
X = andrew ;
X = edward.
Run Code Online (Sandbox Code Playgroud)

或使用经典的“所有解决方案”内置:

?- setof(K,K^nextking(K),Ks),member(X,Ks).
Ks = [andrew, ann, charles, edward],
X = andrew ;
Ks = [andrew, ann, charles, edward],
X = ann ;
...
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我们失去了知识库定义的答案顺序。

  • 这就是 Prolog 的工作原理......它一次显示 *一个* 答案,按`;` 以获得更多。这是合理的,因为您想对所有解决方案做什么仍然未知。如果您对列表感到满意,只需使用 findall 包装查询:`?- findall(X,distinct(nextking(X)),L).` (3认同)