2

这是一个可怕的例子,但是假设我有点ab还有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重复值?

4

1 回答 1

1

该方法很简单,可以找到位于彩色线上的所有点。然后找出哪些点出现多次。

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= []

希望这对您有所帮助。

于 2019-12-20T15:05:23.710 回答