Prolog 检查重复项以回答查询(简单方法?)

Prolog check for duplicates in answer to query (easy way?)

这是一个糟糕的例子,但假设我有点 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]

If no point exists on multiple lines the output would be an empty list List= [].

希望对您有所帮助。