2

問題は:塩が盗まれた!さて、犯人はキャタピラー、トカゲのビル、またはチェシャ猫のいずれかであることがわかりました。3 人は裁判にかけられ、法廷で次のような声明を出しました。

CATERPILLAR: Bill the Lizard ate the salt.
BILL THE LIZARD: That is true!
CHESHIRE CAT: I never ate the salt.

たまたま、そのうちの少なくとも 1 人は嘘をつき、少なくとも 1 人は本当のことを言いました。誰が塩を食べましたか?

請求書が真かどうか、すべてのステートメントが真であることは確かです。チェシャが真の場合、すべてが偽であるため、キャタピラーに違いありません。

述語計算で見てプログラミングすると、次のようになります。

suspect(caterpillar).
suspect(lizard).
suspect(cat).

:- suspect(cat), suspect(lizard).
:- suspect(cat), suspect(caterpillar).
:- suspect(lizard), suspect(caterpillar).

%where these imply not more than one of these can be true or returned in our set

しかし、これを述語論理でさらに説明すると、彼らが行った説明や嘆願をどのように説明するかわかりません。そして、あるステートメントが真である場合、他のステートメントが偽である可能性があることをどのように意味することができます.

4

1 に答える 1

2

このパズルの優れた点の 1 つは、それをモデル化するために 1 階の述語論理さえ必要ないことです。命題論理を使用するだけで十分です。なぜなら、容疑者が嘘をついているのか、真実を語っているのかをブール変数で示すことができ、ステートメント自体また、ブール変数に対するステートメントのみです。

したがって、 Prolog でこのタスクを解決するときは、ブール変数に対して制約ソルバーを使用することを検討してください。詳細については、 を参照してください。

以下は、SICStus Prolog または SWI を使用したサンプル ソリューションです。

:- use_module(library(clpb)).

solution(Pairs) :-
        Suspects = [_Caterpillar,Lizard,Cat],
        pairs_keys_values(Pairs, [caterpillar,lizard,cat], Suspects),
        Truths = [CaterpillarTrue,LizardTrue,CatTrue],
        % exactly one of them ate the salt
        sat(card([1], Suspects)),
        % the statements
        sat(CaterpillarTrue =:= Lizard),
        sat(LizardTrue =:= Lizard),
        sat(CatTrue =:= ~Cat),
        % at least one of them tells the truth:
        sat(card([1,2,3], Truths)),
        % at least one of them lies:
        sat(card([1,2,3], [~CaterpillarTrue,~LizardTrue,~CatTrue])).

そして、このことから一意の解は検索なしで容易に決定されます。

?- solution(Pairs).
Pairs = [caterpillar-1, lizard-0, cat-0].
于 2015-11-05T21:23:43.800 に答える