这是一个糟糕的例子,但假设我有点a
,b
和c
以及蓝线和红线,例如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= []
。
希望这对你有帮助。