我面临的问题有点琐碎。我想在Prolog中不使用逻辑,但是这似乎not/1不是我想要的东西:course(ai).course(pl).course(os).have(X,Y) :- course(X),course(Y),not(X = Y).我查询:have(X,Y), write(X-Y), nl , fail.而且我没有得到想要的结果:(
3 回答
慕虎7371278
TA贡献1802条经验 获得超4个赞
在SWI-Prolog和GNU Prolog中,以下都应该起作用:
have(X, Y) :- course(X), course(Y), X \= Y.
在SWI-Prolog中,您还可以使用dif/2,它可以更加方便,因为您可以在谓词中更早地使用它:
have(X, Y) :- dif(X, Y), course(X), course(Y).
慕少森
TA贡献2019条经验 获得超9个赞
作为上述用户“假”答案的补充,即
“代替not(X = Y),您需要编写\ + X = Y,”
这可能给人的印象是:
一种。“ not”和“ \ +”是不同的东西
b。\ +将起作用,而不是,则不会。
我的理解是“ not”和“ \ +”是等效的,但是\ +在现代Prolog程序中是首选,因为它传达了一种更直观的感觉。具体而言,尽管“不”可能暗示粗心的编码器“不正确”,而“ \ +”却暗示“不可证明”,这与该操作实际上在说什么很接近。在Prolog中,“不是”是“否定即失败”的一个示例,但是可以感觉到\ +将使程序员更清楚在任何给定规则中确切地断言了什么。因此,您可以使用“ not”(大多数PL实现将其保留为向后兼容),但要成为惯用的现代PL程序员,您可能应该更喜欢使用\ +。
添加回答
举报
0/150
提交
取消