猿问

Prolog中的逻辑“不”是什么?

我面临的问题有点琐碎。我想在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.

而且我没有得到想要的结果:(


侃侃尔雅
浏览 1229回答 3
3回答

慕虎7371278

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

慕少森

作为上述用户“假”答案的补充,即“代替not(X = Y),您需要编写\ + X = Y,”这可能给人的印象是:一种。“ not”和“ \ +”是不同的东西b。\ +将起作用,而不是,则不会。我的理解是“ not”和“ \ +”是等效的,但是\ +在现代Prolog程序中是首选,因为它传达了一种更直观的感觉。具体而言,尽管“不”可能暗示粗心的编码器“不正确”,而“ \ +”却暗示“不可证明”,这与该操作实际上在说什么很接近。在Prolog中,“不是”是“否定即失败”的一个示例,但是可以感觉到\ +将使程序员更清楚在任何给定规则中确切地断言了什么。因此,您可以使用“ not”(大多数PL实现将其保留为向后兼容),但要成为惯用的现代PL程序员,您可能应该更喜欢使用\ +。
随时随地看视频慕课网APP
我要回答