Prolog 检查查询答案中的重复项(简单的方法?



这是一个糟糕的例子,但假设我有点abc以及蓝线和红线,例如line(blue,a)表示蓝线上的点a线。

point(a).
point(b).
point(c).
line(blue,a).
line(blue,b).
line(red,a).
line(red,c).

我想找出哪些点P位于多条线上(所以在这种情况下a因为它在蓝线和红线上(。

我开始了,得到了这个:

multiple_points(P) :- point(P), point(_,P).

当我运行查询时?- multiple_points(P).显示一行上的所有点,但我只想显示重复项以查看哪些点出现在多行上。

有没有一种简单的单行方法来仅显示重复P的值?

该方法很容易找到位于彩色线上的所有点。然后找出哪些点多次出现。

point(a).
point(b).
point(c).
line(blue,a).
line(blue,b).
line(red,a).
line(red,c).
points(Z):- findall(X,(line(_,X)) ,Z).
multi([],[]):- !.
multi([H|T],[H|Z]):- member(H,T) , multi(T,Z),!.
multi([H|T],Z):- +member(H,T) , multi(T,Z),!.

get_points(List):- points(Z) , multi(Z,List).

输出

?- get_points(List).
List = [a]

即使您有多个点位于多条线上,它也会起作用。

让您的知识库是

line(blue,a).
line(blue,b).
line(red,a).
line(red,c).
line(purple,c).

此实例的输出为

输出

?- get_points(List).
List = [a,c]

如果多行上不存在点,则输出将为空列表List= []

希望这对你有帮助。

最新更新