在 Prolog 中使用切割

Using cuts in Prolog

我试图找到一个人的名字是 john、peter 或 fred 的所有不同条目。

但是,例如,如果有两个叫 peter 的人,我只想显示一个名字。

到目前为止我的代码如下:

searchpeople(X) :-
   people(_,[X|_]),
   X=john; X=peter; X=fred.

我知道解决方案可能与剪切有关(已阅读其他帖子),但我找不到在尝试检索 X 或 Y 或 Z 时使用剪切的示例(在我的例子中是 john、peter或弗雷德)。

提前致谢。

问题是您混淆了运算符的优先级。就像更传统的编程语言一样,写这样的东西

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).

它让你的意图更清晰、更容易理解。它也更容易调试和扩展。