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

时间:2019-12-20 14:24:50

标签: prolog duplicates predicate meta-predicate

这是一个可怕的例子,但是说我有点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值?

1 个答案:

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

希望这对您有所帮助。