問題タブ [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.
prolog - Prologでテキストロジックパズルを解く-誕生日と月を探す
「7日間で7つの言語」の本を読んでいて、Prologの章に到達しました。学習演習として、私はいくつかのテキストロジックパズルを解こうとしています。パズルは次のようになります。
5人の姉妹は全員、誕生日が異なる月に、それぞれが異なる曜日に誕生日を迎えます。以下の手がかりを使用して、各姉妹の誕生日が当たる月と曜日を決定します。
- ポーラは3月に生まれましたが、土曜日には生まれませんでした。アビゲイルの誕生日は金曜日でも水曜日でもありませんでした。
- 月曜日に誕生日を迎える少女は、ブレンダとメアリーよりも年の初めに生まれました。
- タラは2月に生まれておらず、彼女の誕生日は週末でした。
- メアリーは12月に生まれたわけでも、平日の誕生日でもありませんでした。6月に誕生日を迎えた少女は日曜日に生まれました。
- タラは、誕生日が金曜日ではなかったブレンダの前に生まれました。メアリーは7月に生まれませんでした。
私の現在の実装は、おそらく経験豊富なPrologプログラマーにとっては冗談のように見えます。コードは以下に貼り付けられています。
質問を解決する方法と、コードを明確かつ高密度にする方法について、いくつかの意見をお聞かせください。
すなわち:
- 日は一意である必要があるという制限を入力しないようにするにはどうすればよいですか。
- 月は一意である必要があるという制限を入力しないようにするにはどうすればよいですか。
- 誕生日の順序に関する制限を追加します。
更新chacからの回答に基づいて、パズルを解くことができました。同じレシピに従って、私たち(仕事中のプログラミング言語コンピテンシーグループ)も2番目のパズルを解くことができました。完全な実装と出力例をGitHubに要点として投稿しました。
prolog - Prolog ロジックのテスト例
Prolog のテストが近づいていますが、その基本的な考え方がよくわかりません。私が経験してきた例のいくつかはある程度理解できますが、座って特定の問題を解決する方法をすぐに知ることはできません。
私たちの教授は私たちにいくつかの例を教えてくれました.
例は私たちの本から来ました:
私は、各人に関連するリストがあり、事実を入力する方法を試しましたが、これは正しいアプローチではないと思います. 誰かが私にこれを説明してもらえますか? ありがとう!
編集:
これは私が最終的に得たコードです。パズルのほとんどを完成させ、前菜の1つと飲み物の1つを残しますが、それは修正可能なはずです:
prolog - アインシュタインのなぞなぞを制約満足の方法でモデル化する方法(Prolog)
私のIAの任務は、アインシュタイン問題を解決することです。
PrologのCSPモデルを使用して解決する必要があります。モデルは与えられていませんが、問題といくつかの入力データだけが与えられています。私の解決策は一般的なものでなければなりません。つまり、一部の入力データについては、解決策を提供する必要があります。問題の次元はNです。たとえば、Nは5(5つの家があります)の場合がありますが、変動する可能性があります。
インターネットで見つけた多くのソリューションは、制約をコードに直接配置しますが、入力データを使用して制約を生成する必要があります。この問題は、MAC(Maintain Arc-Consistency)アルゴリズムを使用して解決する必要があります。
私はそれについてたくさん読んだ(アインシュタインのなぞなぞ)。問題を実装するには、問題の表現が必要です。
問題は、Prologで問題を表現する方法が正確にわからないことです(基本的なPrologを知っている、追加のライブラリを使用していない、clpfdライブラリ(prolog clpソルバー)を使用することは許可されていません)。
入力(14の手がかり)から制約を作成する必要があることはわかっています+同じグループ(国籍など)のすべての変数が異なる必要があるという制約は、次のように述語を実装できます。
例えば:
今、私はこの入力を解析し、リストのリストを取得することができました:
今、私はこの生成された情報を使用していくつかの制約を構築する必要があると思います、私が読んだことから、バイナリ制約(私が思う述語として表される)を使用するのは良い考えですが、私はいくつかの単項制約も持っているので、どうすればよいですか?それらすべてを含めるための制約を表しますか?
もう1つの問題は、リストを検索して変更する必要がないように、変数(計算データがある場所)をどのように表現するかです(プロローグでは、命令型言語のようにリストを変更できないため)。
そこで、変数のリストを使用することを考えました。各変数/要素は3タプルで表されます:( var, domain, attrV
)、varには変数の現在の値が含まれ、ドメインは次のようなリストです:[1、2、3、4、 ..、N]であり、attrVは、対応する属性(たとえば赤)の(Nの)1つの値です。1つの要素は次のようになります(C, [1, 2, 3, 4, 5], red)
。
その他の問題:タプルのキューがあり、制約が満たされない場合はこのキューが変更されるため、プロローグ(AC-3アルゴリズムを使用)にMACアルゴリズムを実装するにはどうすればよいですか?これは変数リストを変更することを意味します、そして再び、Prologのリストをどのように変更すればよいですか。
どんな助けでもいただければ幸いです!
上記のリンクからCSPソルバーを使用して問題の特定のバージョンを解決しようとしましたが、それでも解決策を見つけることができません。この方法で解決策を知ることができるので、解決策を取得したいと思います。一般バージョンの制約を正しく表します。
追加されたコード:
algorithm - Zebra/Einsteinパズルをアルゴリズムで生成する
まず、私は必ずしも完全なアルゴリズムを探しているわけではありません。コピーして貼り付けて、それを1日と呼ぶことができます。どんな「一般的なアプローチ」の解決策でも私には問題ありません!
この投稿全体は、仕事が遅い日、このサイトに出くわし、ジェネレーターをどのように実装したかを理解できなかったことに拍車をかけました。
問題
ご存じない方のために説明すると、「ゼブラパズル」や「アインシュタインのパズル」は、おそらく以前に遭遇したことのある有名なロジックパズルです。
完全なwiki記事はここにありますが、関連するビットを投稿します。
これはすべてうまくいっています。特に制約プログラミングを使用して、この問題を解決するための簡潔で巧妙な方法をオンラインでいくつか見つけました。しかし、私が興味を持っているのは、これらのタイプのパズルをもっと作ることです。
もっと作る
明らかに、行列表現はこれについて考える論理的な方法です。各列には、人、家、飲むもの、運転する車の種類などが含まれています。
私の最初の考えは、ランダムに生成された完全な(つまり、解決された)グリッドから始めて、(何らかの方法で)解決されたバージョンからそれを一意に識別するヒントを作成することでした。何かを決定できるたびに、それはグリッドから削除されます。
最初にリストしたサイトをリッピングすると、グリッドを解決するために使用できる次の「ヒント」は次のタイプになります。
人/動物/植物は与えられた家に住んで/成長します。
人/動物/植物は特定の家に住んでいない/成長していません。
人/動物/植物は他の人/動物/植物と同じ家に住んでいます。
人/動物/植物は、他の人/動物/植物の直接の隣人です。
人/動物/植物は、他の人/動物/植物の左または右の隣人です。
人/動物/植物と他の人/動物/植物の間に1つの家があります。
左または右の人/動物/計画と他の人/動物/植物の間に1つの家があります。
人/動物/植物と他の人/動物/植物の間に2つの家があります。
左または右の人/動物/計画と他の人/動物/植物の間に2つの家があります。
人/動物/植物は、他の人/動物/植物から左または右に住んでいます。
これらを一般化、拡張する方法などを確認できます。
難しいのは、私のアプローチ(完全なグリッドから始めてこれらのヒントを生成する)を使用して、作成するヒントのセットが絶対にターゲットグリッドになることを確認する方法がわからないことです。
たとえば、「イギリス人は松の木を所有していない」と言った場合、パズルのどの時点でも2つのものを決定的に組み合わせることができません。しかし、解決する必要のある木が2つしかない場合、これは実際には決定的な証拠となる可能性があります。
私はこれを完全に間違った方法で考えていますか?より良いアプローチは、ランダム化された事前定義された既知の要素を使用してグリッドを作成し(つまり、赤い家が中央にある)、これらのヒントを構築のルールとして使用してグリッドを構築することです。
アドバイス、読むべき記事、学ぶためのプログラミング技術など、大歓迎です!
prolog - これをPrologでコーディングする方法は?
このことをPrologにコード化するために私が何をするか説明してもらえますか?
メイソン、アレックス、スティーブ、サイモンは警察のラインナップに立っています。それらの1つは金髪で、ハンサムで、傷がありません。金髪ではない2人がメイソンの両側に立っています。アレックスはちょうど一人のハンサムな男の隣に立っている唯一の人です。ちょうど一人の傷ついた男の隣に立っていないのはスティーブだけです。金髪でハンサムで怖くないのは誰ですか?
私はここにいます、
p->立っている(x、y)
twoOfThem(金髪ではなく、メイソンの両側に立っている)
ちょうど1人のハンサムの隣に立っているのは1人だけのアレックス
スティーブは傷のない隣に立っているだけではありません。
prolog - アインシュタイン パズルを一次論理の閉じた式のセットとして表現する
古典的なアインシュタイン/ゼブラ パズルは次の形式で与えられます。
同じ道に色の違う家が5軒並んでいるとします。各家には異なる国籍の男性が住んでいます。人は皆、好きな飲み物、好きなタバコのブランドを持ち、特定の種類のペットを飼っています。
タスクは、パズル内の 5 人の人物がイギリス人、スウェーデン人、デンマーク人、ノルウェー人、ドイツ人、およびキープであると仮定して、これらのステートメントを一次論理の一連の閉じた式として表現することです。 (X,Y) は、X がペット Y を飼っていることを意味します。これらは後でプロローグに変換されます。
私の質問は、ステートメントを正しい方法で変換しようとしているかどうかです。今、私は次のようなものを持っています:
これは正しいですか、それとも私が試した他の方法に似ているはずです:
私も次のようなことを試みました:
最初のものが最も正しいと思いますが、よくわかりません。また、一次論理でセンターやネイバーなどを表現する方法もわかりません。これらのどれかが正しいに近いですか?
編集:おそらく正しいと思われる解決策を思いつきました。CLOSED式と書かれていることに気づいたので、次のようにしました。
これは正しい方法ですか?どんな助けでも大歓迎です。
prolog - SWI-Prolog の使用、構文、シングルトン エラー
宿題の論理パズルを解くために SWI-prolog を使用する必要がありますが、プログラミングのバックグラウンドがあっても構文と意味が非常に扱いにくいと感じています。私が直面している問題は、シングルトン変数に関するエラーと、パズルが false を返すことです。
これは私がこれまでに行ったことです:
これが質問です。正しい方向への穏やかなナッジ、または言語をよりよく理解するのに役立つ答えをいただければ幸いです。
prolog - Prolog でロジック パズルを解く
私は Prolog を学んでいますが、この問題に行き詰まり、どうやって終わらせたらよいのか本当にわかりません。自分のコードは正しいと思っていましたが、Sictus で警告が表示され続け、どこが間違っているのかわかりません。
問題は次のとおりです。
そして、ここに私のコードがあります:
ゼブラパズルのいくつかの例を使用してそれを行いました.