用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