1

假设你碰巧知道这$P是真的当且仅当$Q它是真的。您可以编写一对完整性约束来强制执行此操作:

:- $P, not $Q.
:- $Q, not $P.

但是,有时$P$Q是相当长的表达式;例如,:- truth(martin, 2), house_assign(turner, H1), animal_assign(P2, whales), house_assign(P2, H2), not opposite(H1, H2).最好只写一次。有没有办法在 clgo 中简洁地指定这个?

(相关:https ://stackoverflow.com/a/28319815/23845 中的 Q4 ;那里的建议明确表示谓词中 P/Q 的真实性,因此您可以对其进行比较。这真的是唯一的方法吗?)

4

1 回答 1

1

我会这样写:

:- {$P; $Q}==1.

然而,它似乎不适用于 and 内的$P连接$Q

所以我的修复看起来像这样((a(N)b(N))iff c(N)):

{a(1);a(2);b(1);b(2);c(1);c(2)}.    
num(1;2)

x(N):-a(N),b(N).
:- {x(N);c(N)}==1, num(N).
于 2020-11-29T12:09:05.597 回答