2017-12-21 31 views
0

パズルはこのようになります。島には4つのテンプルがあります。各寺には名前、場所、建造日が記されています。どの4つの組み合わせ(名前、場所、日付)が正しいかを判断するのに役立つ4つの手掛かりがあります。私はプロローグを使ってこれを解決しなければならない。プロローググリッドベースのロジックパズルがついた

寺院の名前は:hori_takesi、okabe honzo、sama takakoとtakahashiです。場所は、funai、toyagi、uchida、usuiです。内田における神社と1645年に建てられた神殿の

  1. 、1はさま 貴子であり、他は岡部です:日付は、あなたは、次の手がかりを与えている1525年、1585年、1645年と1705

    ですhonzo。

  2. 船井の寺院はtoyagiの寺院は120年臼井
  3. 堀の神殿の前に建てられた高橋
  4. 前に建てられたtakesi WASA

は、私は、次のknowlegdeベースを作成したさま貴子後に建てられました可能なすべての組み合わせを保持します。

temple(hori_takesi, Location, Y). 
temple(okabe_honzo, Location, Y). 
temple(sama_takako, Location, Y). 
temple(takahashi, Location, Y). 

temple(Name, funai, Y). 
temple(Name, toyagi, Y). 
temple(Name, uchida, Y). 
temple(Name, usui, Y). 

temple(Shrine, Location, 1525). 
temple(Shrine, Location, 1585). 
temple(Shrine, Location, 1645). 
temple(Shrine, Location, 1705). 

プロローグに問い合わせるクエリは、?-solution(X)です。これは4つの正しい組み合わせをすべて返さなければなりません。だから、Xは4つの要素、すなわち寺院のリストです。

溶液(X)。すべての手がかりが真であれば真です。だから私は次のようにした:

clue1(X) :- temple(Name, uchida, Y), Y\= 1645 
clue2(X) :- temple(Name, funai, Y), temple(Shrine, takahashi, Y1), Y < Y1. 
clue3(X) :- temple(Name, toyagi Y), temple(Shrine, usui, Y1). Y1 is Y + 120. 
clue4(X) :- temple(hori_takesi, Loc, Y), temple(sama_takako, Loc, Y1) Y > Y1. 
solution(X) :- clue1(X), clue2(X), clue3(X), clue4(X). 

私はここからオンワートを進める方法がわからない。私が得たもう一つのヒントはmember/2を使うことです。しかし、それを実装する方法についてはわからない。誰かが私を助けることができればそれを愛する。

+1

さま貴子後に建てられました – damianodamiano

+1

@damianodamiano:高度なツールを勉強する前に、より良いOPが基礎を学びます。 CLP(FD)それは[漏れ抽象化](https://en.wikipedia.org/wiki/Leaky_abstraction)です。あなたの述語で何が起こっているのかわからなければ、それを使うことはできません... – CapelliC

+0

質問タイトルでは、あなたの試みから欠けている基本的な詳細。変数が一緒に演奏するチャンスが得られる単一の述語で*グリッド*をモデル化する必要があります。各手がかりはグリッド行の一部のサブセットで動作します。各行はエンティティを表しているからです。 – CapelliC

答えて

0

ここに私の答えがあります。 私はSICStus Prologを使用していますが、私はclpfdライブラリを使用しています。

:- use_module(library(clpfd)). 

あなたの問題を整数に変換する必要があります。

このように私は寺院の名前が1..4になると決めました。 場所と年は質問と同じ順番になります。

ソリューションの名前の順序が含まれているため、名前の順序が異なるソリューションがあります。

names([hori_takesi, okabe_honzo, sama_takako, takahashi]). 
locations([funai, toyagi, uchida, usui]). 
years([1525, 1585, 1645, 1705]). 

制約は制約を使用することです。解決策は必要条件を満たす必要があります。

solver(Temples):- 
    years(Years), 
    length(Temples, 12), 
    domain(Temples, 1, 4), 
    global_cardinality(Temples, [1-3, 2-3, 3-3, 4-3]), 
    optim(Temples), 
    clue1(Temples), 
    clue2(Temples), 
    clue3(Temples), 
    clue4(Temples), 
    labeling([], Temples), 
    write(Temples). 

optim(Temples):- 
    element(1, Temples, N1), 
    element(2, Temples, N2), 
    element(3, Temples, N3), 
    element(4, Temples, N4), 
    all_distinct([N1, N2, N3, N4]), 
    10 #= N1 + N2 + N3 + N4, 
    element(5, Temples, N5), 
    element(6, Temples, N6), 
    element(7, Temples, N7), 
    element(8, Temples, N8), 
    all_distinct([N5, N6, N7, N8]), 
    10 #= N5 + N6 + N7 + N8, 
    element(9, Temples, N9), 
    element(10, Temples, N10), 
    element(11, Temples, N11), 
    element(12, Temples, N12), 
    all_distinct([N9, N10, N11, N12]), 
    10 #= N9 + N10 + N11 + N12. 

最初の手がかりは:内田における神社と1645年に建てられた寺院のうち、一つはさま貴子あり、他方は岡部のhonzoです。

clue1(Temples):- 
    element(7, Temples, N1), 
    element(11, Temples, N2), 
    (N1 #= 3 #/\ N2 #= 2) 
    #\/ (N2 #= 3 #/\ N1 #= 2). 

第2の手がかり:ファカイの寺院は高橋の前に建てられました。 私はfunaiの位置5、高原4の要素をN1とN2に保存します。それから私は彼らの日付を取得する必要があります。日付は寺院の最後の4つの要素ですので、私は位置が> 8になるようにします。次に、日付であり、同じ値N1とN2を持つ要素を取得し、解がY2> Y1というヒントを満たすように制約します。

clue2(Temples):- 
    element(5, Temples, N1), 
    element(4, Temples, N2), 
    Y1 #> 8, 
    Y2 #> 8, 
    element(Y1, Temples, N1), 
    element(Y2, Temples, N2), 
    Y2 #> Y1. 

第3の手がかり:ぬいぐるみの寺院は、寺院の120年前に建てられました。 あるいは、日付の私たちのために、日付の位置との差がある2

第四手がかり:堀takesiは、あなたがこの問題を解決するためにclpfdライブラリを使用する必要があります

clue4(Temples):- 
    element(1, Temples, N1), 
    element(3, Temples, N2), 
    Y1 #> 8, 
    Y2 #> 8, 
    element(Y1, Temples, N1), 
    element(Y2, Temples, N2), 
    Y1 #> Y2. 
+0

CLP(FD)それは強力なツールですが、ここでは実際に誤用されています... – CapelliC

+1

@CapelliCなぜそれが誤用されていますか? – BlueDi

+0

私は、問題を解決するための努力、おもちゃのものまで、強力なツールから期待しています。コードは非常に長く、問題を理解しています(例えば、Clue4/1では、Y1#> 8の目的は何ですか?)。だから私はあなたの答えはジュリアスだけを混乱させることができると思う。 – CapelliC

関連する問題