Here我找到了一个迷人的,如果相当简单的逻辑问题:
此列表中的哪个答案是此问题的正确答案?
- 以下所有内容。
- 以下都不是。
- 以上所有。
- 以上之一。
- 以上都不是。
- 以上都不是。
醇>
将这些命题重写为某些编程语言中的语句是相当容易的:
def p1 = p2 && p3 && p4 && p5 && p6
def p2 = !p3 && !p4 && !p5 && !p6
def p3 = p1 && p2
等等。更难的是实际运行这样的程序而不进入无限循环。
是否有一种语言或图书馆(或其他东西)能够或多或少地解决这个问题?我正在考虑Prolog,因为我对Prolog的所有了解都用于解决“像这样的问题”。
代码会是什么样的?
答案 0 :(得分:4)
使用 Prolog 来解决这些逻辑难题确实微不足道。
例如,一种方法是使用 CLP(B),它代表布尔变量上的约束逻辑编程,并且有自己的标记clpb
几个Prolog系统附带CLP(B)解算器。 SICStus Prolog是一个非常突出的例子。
这种方法的核心思想是将任务表达为对布尔变量的约束满足问题(CSP)。
在这个具体案例中,我们可以使用命题变量 A 1 ,A 2 ,...,A 6 代表回答问题的不同方式。每个答案都将这些变量中的一个与其他变量联系起来,反映了答案对其他答案的陈述。
使用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].
因此,回答5 是唯一可以在保持所有陈述一致的情况下选择的。
无限循环 在这样的表述中不会出现,因为各个约束的每个始终终止,整个程序只包含一系列这样的约束。
约束求解器使用称为约束传播的过程自动推导出单个可允许的解决方案。