如何表现独特性?

时间:2014-09-25 02:20:14

标签: prolog

我正在尝试编写一名代理人来确定一名玩家拥有的牌,并且我很难表示每张牌只能被发给一名玩家。

我有这样的东西吗?

player(p1).
player(p2).

card(ace).
card(king).
card(queen).
card(jack).

但我正在努力编写唯一性规则。借用逻辑类中的某些东西,我虽然将唯一性定义为"如果X有Y,那么如果某些东西有Y,那么某些东西必须是X"。

has_card(P, C) :-
    player(P),
    card(C),
    not(player(P2),
        P2 =\= P,
        has_card(P2, C)
    ).

但由于未定义not/3,因此失败。

我尝试将其重写为:

has_card(P, C) :-
    player(P),
    card(C),
    player(P2),
    P2 =\= P,
    not(has_card(P2,C)).

然后查询(我希望返回false

has_card(P, ace).

错误

ERROR: =\=/2: Arithmetic: `player1/0' is not a function

那么,我怎样才能代表唯一性?

^复杂 - 似乎 - 省略了不必要的细节


编辑:第一次尝试has_cardP2==P应该是P2=\=P,现在已修复

1 个答案:

答案 0 :(得分:2)

首先,正如错误告诉您的那样,您正在使用=\=,即arithmetic inequality。要在standard order of terms上进行比较,您应该使用\==

然后,“不是”,如“当否定目标不真实时”,你应该使用\+,如下所示:

\+ a == b

相同
a \== b

not/1谓词在大多数Prolog实现中仍然可用,但不推荐使用。

修复这两件事会解决你目前遇到的问题。

但是,就像现在一样,你的has_card/2在任何时候都不会将卡片映射到播放器,实际上(就我所见,它使用循环逻辑)。由于您没有在任何特定时刻显示您究竟知道哪些牌属于哪个牌手,因此很难对此发表评论。无论哪种方式,您传递的某种术语可能比使用assertretract更改数据库更好。