我正在尝试编写一名代理人来确定一名玩家拥有的牌,并且我很难表示每张牌只能被发给一名玩家。
我有这样的东西吗?
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_card
我P2==P
应该是P2=\=P
,现在已修复
答案 0 :(得分:2)
首先,正如错误告诉您的那样,您正在使用=\=
,即arithmetic inequality。要在standard order of terms上进行比较,您应该使用\==
。
然后,“不是”,如“当否定目标不真实时”,你应该使用\+
,如下所示:
\+ a == b
与
相同a \== b
not/1
谓词在大多数Prolog实现中仍然可用,但不推荐使用。
修复这两件事会解决你目前遇到的问题。
但是,就像现在一样,你的has_card/2
在任何时候都不会将卡片映射到播放器,实际上(就我所见,它使用循环逻辑)。由于您没有在任何特定时刻显示您究竟知道哪些牌属于哪个牌手,因此很难对此发表评论。无论哪种方式,您传递的某种术语可能比使用assert
和retract
更改数据库更好。