2017-04-04 65 views
1

Here我发现了一个迷人的,如果很容易的逻辑问题:软件解决一个逻辑难题

在该名单中的回答是正确答案这个问题?

  1. 以下全部。
  2. 以下都不是。
  3. 以上全部。
  4. 其中之一。
  5. 以上都不是。
  6. 以上都不是。

这将是很容易重新编写这些命题在一些编程语言语句:

def p1 = p2 && p3 && p4 && p5 && p6 
def p2 = !p3 && !p4 && !p5 && !p6 
def p3 = p1 && p2 

等。更难的是真正运行这样的程序,而不会陷入无限循环。

有没有一种语言或图书馆(或其他东西)可以或多或少地解决这个问题?我在想Prolog,因为我对Prolog的所有了解都是用来解决“这样的问题”。

代码是什么样的?

回答

3

Prolog来解决这样的逻辑谜题确实微不足道。

例如,一种方法是使用CLP(B),它代表约束逻辑 编程过布尔变量并有自己的 标签,

几个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]. 

因此,答案是唯一可以保持所有陈述 一致的选项。

一种无限循环不能在这样的制剂出现,由于各个约束的每个总是终止,而且整个程序仅由这样的约束的序列组成。

的约束求解器具有自动推导出的单一允许解,使用被称为约束  传播过程。

+0

如果“卡”意味着基数,那么您已经将(4)解释为“恰好是上述之一”。如果您将其解释为“至少一个以上”,答案不会改变。 – Malvolio

+0

是的,的确如此,我已将其解释为“*完全*上述之一”。为了将其解释为“至少上述之一,请在'card/2'表达式中将'[1]'更改为'[1,2,3]',这实际上表示基数。更确切地说,'card(Ls ,Exprs)'是true * iff * Exprs中* true *表达的数目是整数列表中的成员'Ls'或表示整数*范围*的整数对,所以不用'[1,2 ,3]',您可以等效地使用'[1-3]'。解决方案保持完全相同。 – mat