在 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).
它让你的意图更清晰、更容易理解。它也更容易调试和扩展。
我试图找到一个人的名字是 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).
它让你的意图更清晰、更容易理解。它也更容易调试和扩展。