Prolog 检查重复项以回答查询(简单方法?)
Prolog check for duplicates in answer to query (easy way?)
这是一个糟糕的例子,但假设我有点 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]
If no point exists on multiple lines the output would be an empty list List= []
.
希望对您有所帮助。
这是一个糟糕的例子,但假设我有点 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]
If no point exists on multiple lines the output would be an empty list
List= []
.
希望对您有所帮助。