問題タブ [zebra-puzzle]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
language-agnostic - 「シマウマの所有者」をプログラムで解決しますか?
編集: このパズルは「アインシュタインのなぞなぞ」としても知られています
The Who owns the Zebra (ここでオンライン バージョンを試すことができます) は古典的なパズル セットの例であり、Stack Overflow のほとんどの人はペンと紙で解決できるに違いありません。しかし、プログラマティック ソリューションはどのようなものになるでしょうか。
以下の手がかりに基づいて...
- 家が5軒あります。
- 各家には独自の色があります。
- 家の所有者はすべて異なる国籍です。
- 彼らはすべて異なるペットを飼っています。
- 彼らはすべて異なる飲み物を飲みます。
- 彼らは皆違うタバコを吸っている。
- そのイギリス人男性は赤い家に住んでいます。
- スウェーデン人は犬を飼っています。
- デーンはお茶を飲みます。
- 緑の家は白い家の左側にあります。
- 彼らは温室でコーヒーを飲みます。
- ポール・モールを吸う男は鳥を飼っている.
- 黄色い家では、彼らはダンヒルを吸っています。
- 真ん中の家では牛乳を飲みます。
- ノルウェー人は最初の家に住んでいます。
- ブレンドを吸っている男性は、猫がいる家の隣の家に住んでいます。
- 馬を飼っている隣の家ではダンヒルを吸っている。
- ブルーマスターを吸う男はビールを飲む。
- ドイツ人はプリンスを吸う。
- そのノルウェー人は青い家の隣に住んでいます。
- 彼らはブレンドを吸う家の隣の家で水を飲みます。
...ゼブラの所有者は誰ですか?
prolog - リスト内の一意の要素(Prolog)
アインシュタインのなぞなぞのバリエーションを実装していますが、問題が発生しています。
解を計算しようとするとき、私はこれを試します:
次に、次のように入力して解決策を尋ねます。solve(Street)
ただし、これは解決策として出てきます。
- 家(花、食べ物、ペット、スポーツ)
- 家(花、食べ物、ペット、スポーツ)
- 家(x 、食べ物、ペット、スポーツ)
- 家(花、食べ物、ペット、スポーツ)
- 家(x、花、ペット、スポーツ)
ご覧のとおり、 xは2回ありますが、残りはすべての種類の食品、花、ペット、スポーツです。しかし、すべてのタイプはユニークです。ある人が花Xを好きなら、他の誰もXを好きになることはできません。
さて、私のソリューションが2 xを与える理由は簡単にわかります。ヒントがたくさん与えられていますが、すべてのヒントで言及されている花は4つだけです。したがって、Prologは別の花があることを知りません。それが可能であり、他のすべてのヒントを満たしているという理由だけで、xを2回使用します。
私が言いたいのは、ストリートの食べ物や花などはすべて種類がユニークなので、すでにすべての種類を使用している場合は空白のままにする必要があるということです。3は次のようになります:house(x , food, pet ,sport)
そして5は次のようになります:house(_, flower, pet, sport)
。
また、これをヒントに追加してみました:(「サボテン」はヒントに記載されていない花の1つだとしましょう)
member(house(cactus,_,_,_), Street)
しかし、私のプログラムは終了しません...
ヒントは次のよう
になります。with is_neighbour(house(_,_,_,football),house(_,_,fish,_), Street),
:AとBがで隣り合っている場合にis_neighbour(A,B,List)
与えます。ヒントは次のように翻訳できます。サッカーを愛する人は、魚を飼っている人の隣に住んでいます。true
List
さらに情報を提供する必要がある場合は、詳しく説明します。:)
prolog - アインシュタインの謎
私は Prolog を初めて使用し、Prolog でゼブラのなぞなぞとしても知られるアインシュタインのなぞなぞのようななぞなぞをモデル化しようとしています (ただし、10 の家と 30 のヒントがあります)。このモデルの例を出発点として使用しています。
http://www.baptiste-wicht.com/2010/09/solve-einsteins-riddle-using-prolog/
しかし、私のなぞなぞでは、X が Y の右であると言えなければなりません。そして、直接右という意味ではなく、リスト内で右という意味です。したがって、Y は家 1 に、X は家 9 にいることができます。
Prologでこれを行うにはどうすればよいですか? Y は、X と X の前のすべての要素をそのリストから取り出すことによって構築されたリストのメンバーであるという述語について考えていましたが、それを行う方法や、それを適合させる方法がわかりません。前述の例。
prolog - Prologでロジックパズルを解く
「LearnPrologNow」を読んでいますが、自分で解決できなかった演習の1つは次のとおりです。
色の違う3軒の家が隣接する通りがあります。それらは赤、青、緑です。さまざまな国籍の人々がさまざまな家に住んでいて、彼らはすべてさまざまなペットを飼っています。ここにそれらについてのいくつかのより多くの事実があります:
- イギリス人は赤い家に住んでいます。
- ジャガーはスペインの家族のペットです。
- 日本人はカタツムリの番人の右側に住んでいます。
- カタツムリの飼育係は青い家の左側に住んでいます。
ゼブラを保持しているのは誰ですか?
zebra/1
シマウマの所有者の国籍を示す述語を定義します。ヒント:家や通りの表現を考えてみてください。Prologで4つの制約をコーディングします。
member
有用なsublist
述語かもしれません。
Prologの下でそれをコーディングする方法について何かアイデアはありますか?ありがとう。
prolog - なぜ私はプロローグでゼブラパズルの答えを得ることができないのですか?
これは現在私のコードです、私はゼブラパズルを解こうとしています。
これを入力してzebra.plとして保存しました。これを開いて、[zebra]をSWI-prologに入力すると、N1、P1、C1などのシングルトン使用に関する警告メッセージが返され、trueが返されます。 print(WaterDrinker)を使用して水を飲む人を印刷するように依頼すると、_G317とtrueが返されます。
なぜそれがこれを行い、ノルウェー語である可能性のある答えを返さないのですか?C3やZebraOwnerのような変数を返すように頼んだ場合も同じです
prolog - シマウマ型パズルの解き方のアドバイス
次の問題を解決するためにあなたの助けが必要です:
3 人の女の子 (アン、スーザン、アリス) が、何色の靴とドレスを着るかを選択する必要があります。靴とドレスの色は、白、青、緑の 3 色があります。
主な条件:
- アンは白が嫌いです。
- スーザンは同じ色の靴とドレスを着ています。
- アリスは白い靴を履いています。
- アリスとアンの靴とドレスは色が違います。
私のコードは 2 つの条件のみを満たしています。私は、スーザンと同じ色の条件を満たしているのにちょっと苦労していますが、他の女の子は別の色の服を着る必要があります。
これが私が思いついたものです:
上記のコードは問題なく動作しますが、解決策が多すぎます。さらに、スーザンが同じ色の靴とドレスを着用するという条件について、論理的な解決策を思いつきませんでした。
ありがとう。
prolog - アインシュタインの謎 プロローグ
AI クラスのプロローグの宿題で助けが必要です。問題は、アインシュタインのパズルのプロローグ コードを書くことです。自分で書き留める方法は知っていますが、宿題にはいくつかの制約があります。
家は順序付けられているため、リストを使用する必要があることはわかっています。家の特徴もリストを使いたかったのですが、ここで問題が発生しました。
匿名変数house(englishman, red, _, _, _)を使用するつもりでした。しかし、宿題のためにそれを解釈する方法がわかりません。
制約は次のとおりです。次の二項述語記号を使用する必要があります。
それ以外は、任意の数の述語を自由に使用できます。
これが事実を初期化する方法ですが、この場合のルールの作成方法はわかりません
少しは理にかなっていますが、同時に完全に間違っているように見えます。これではどこにも行けないと思います。:/
algorithm - F# を使用したアインシュタインの謎解き
F# を使用したアインシュタインのリドルソリューションを探していますが、アインシュタインだけが F# を満たすことがわかりました。
F# はこの問題に適していますか? 他の実装はありますか?
prolog - clpfd Prologライブラリを使用してゼブラパズル(別名アインシュタインパズル)を解く
選択した制約ソルバーを使用してゼブラパズルを解く演習を行い、Prologclpfdライブラリを使用して試しました。
Prologでこの問題を解決する他の慣用的な方法があることを私は知っていますが、この質問は特にclpfd
パッケージに関するものです!
だから私が解決しようとしているパズルの特定のバリエーション(それらがたくさんあるとすると)はこれです:
5軒の家があります
- イギリス人は赤い家に住んでいます
- スウェーデン人は犬を飼っています
- デンマーク人はお茶を飲むのが好きです
- 緑の家は白い家に残されています
- 温室の所有者はコーヒーを飲みます
- ポールモールを吸う人は鳥を飼っています
- 真ん中の家でミルクを飲む
- 黄色い家の所有者はダンヒルを吸う
- ノルウェー人は最初の家に住んでいます
- マールボロ喫煙者は猫の飼い主の隣に住んでいます
- 馬の飼い主はダンヒルを吸う人の隣に住んでいます
- ウィンフィールド喫煙者はビールを飲むのが好きです
- ノルウェー人は青い家の隣に住んでいます
- ドイツ人はロスマンを吸う
- マールボロ喫煙者には、水を飲む隣人がいます
私は次のアプローチでそれを解決しようとしました:
家が持つことができる各属性は、「英国」、「犬」、「緑」などの変数としてモデル化されます。属性は、それらが発生する家に応じて、たとえば変数の場合、1〜5の値を取ることができます。 「犬」は値3を取り、犬は3番目の家に住んでいます。
このアプローチにより、次のような隣接制約のモデル化が容易になります。
しかし、どういうわけか、clpfd
(IMO)問題が正しくモデル化されていても、パッケージは解決策を生成しません(Choco制約ソルバーでまったく同じモデルを使用し、結果は正しいものでした)。
完全なコードは次のとおりです。
内の概念を誤解しましたかclpfd
、それともここで明らかな何かを単に見逃していますか?それが役立つ場合は、ここでChocoとScalaを使用して実装された同じアプローチを見つけることができます。
編集:ソルバーが問題を解決できないと私が信じる理由は、変数の明確な値が出てこないためですが、「魚1..3 \/5」などの範囲のみが出てくるからです。