我试图找到一个人的名字是约翰,彼得或弗雷德的所有不同的条目。
但是,如果有两个人叫peter,我只想显示一个名称。
到目前为止我的代码如下:
searchpeople(X) :-
people(_,[X|_]),
X=john; X=peter; X=fred.
我明白解决方案可能与剪辑有关(阅读其他帖子),但我找不到一个例子,在尝试检索X或Y或Z时使用剪切(在我的情况下,约翰,彼得或弗雷德) )。
提前致谢。
答案 0 :(得分:3)
问题在于您混淆了运算符优先级。就像更常规的编程语言一样,写这样的东西
if ( A and B OR C OR D )
...
几乎肯定会让你遇到麻烦,你的代码也有同样的问题。运算符优先级和关联性导致
searchpeople(X) :-
people(_,[X|_]) ,
X=john ;
X=peter ;
X=fred .
被解析,好像是写的
searchpeople(X) :-
( people(_,[X|_]) ,
X = john
) ;
( X = peter ;
X = fred
) .
这可能不是你想要的。
虽然你可以使用括号来获得你最想要的效果:
searchpeople(X) :-
people(_,[X|_]) ,
( X = john ;
X = peter ;
X = fred
) .
你最好分开一些东西:
search_people(X) :-
people(_,[X|_]) ,
desired_person(X).
desired_person(john).
desired_person(peter).
desired_person(fred).
它使您的意图更清晰,更容易理解。它也更容易调试和扩展。