用Prolog来解决这样的逻辑谜题确实微不足道。
例如,一种方法是使用CLP(B),它代表约束逻辑 编程过布尔变量并有自己的 标签,clpb。
几个Prolog系统附带CLP(B)求解器。 SICStus Prolog就是一个非常突出的例子。
这种方法的核心思想是将布尔 变量上的约束满足问题表示为 (CSP)。
在这个具体的例子,例如,我们可以使用命题 变量一个,A ,...,A 来表示不同的方法来回答这个问题。每个答案都将这些变量之一与其他几个 相关联,反映了答案对其他答案的说明。
使用SICStus Prolog的,什么每个答案的手段可能看起来像 这样的声明描述:
:- use_module(library(clpb)).
solution([A1,A2,A3,A4,A5,A6]) :-
sat(A1 =:= A2*A3*A4*A5*A6),
sat(A2 =:= ~(A2+A3+A4+A5+A6)),
sat(A3 =:= A1*A2),
sat(A4 =:= card([1],[A1,A2,A3])),
sat(A5 =:= ~(A1+A2+A3+A4)),
sat(A6 =:= ~(A1+A2+A3+A4+A5)).
从下面的查询,我们看到只有一个答案在逻辑上是可以受理受这些 约束:
?- solution(Vs).
Vs = [0, 0, 0, 0, 1, 0].
因此,答案是唯一可以保持所有陈述 一致的选项。
一种无限循环不能在这样的制剂出现,由于各个约束的每个总是终止,而且整个程序仅由这样的约束的序列组成。
的约束求解器具有自动推导出的单一允许解,使用被称为约束 传播过程。
来源
2017-04-04 18:39:11
mat
如果“卡”意味着基数,那么您已经将(4)解释为“恰好是上述之一”。如果您将其解释为“至少一个以上”,答案不会改变。 – Malvolio
是的,的确如此,我已将其解释为“*完全*上述之一”。为了将其解释为“至少上述之一,请在'card/2'表达式中将'[1]'更改为'[1,2,3]',这实际上表示基数。更确切地说,'card(Ls ,Exprs)'是true * iff * Exprs中* true *表达的数目是整数列表中的成员'Ls'或表示整数*范围*的整数对,所以不用'[1,2 ,3]',您可以等效地使用'[1-3]'。解决方案保持完全相同。 – mat