这是一个可怕的例子,但是说我有点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
值?
答案 0 :(得分:2)
该方法很容易找到彩色线上的所有点。然后找出发生多次的点。
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= []
。
希望这对您有所帮助。