在Prolog中使用削减

时间:2015-03-20 20:23:30

标签: prolog

我试图找到一个人的名字是约翰,彼得或弗雷德的所有不同的条目。

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

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

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

我明白解决方案可能与剪辑有关(阅读其他帖子),但我找不到一个例子,在尝试检索X或Y或Z时使用剪切(在我的情况下,约翰,彼得或弗雷德) )。

提前致谢。

1 个答案:

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

它使您的意图更清晰,更容易理解。它也更容易调试和扩展。