問題タブ [prolog-dif]
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.
list - プロローグでリスト順列にアクセスするには?
リスト順列にアクセスし、それを引数として他の関数に渡したいです。
これは順列コードです:
list - プロローグリスト高原
いくつかの簡単な演習を実行しようとして、プロローグを紹介されたばかりですが、私はこれに固執しています。入力リストのすべてのサブリストを出力するプログラムを作成しようとしています。各サブリストの長さは1より大きいため、より大きなサブリストに拡張することはできません。また、サブリストのリストの開始位置も出力されます。したがって、サンプル出力は次のようになります。
私はまだ宣言的なこと全体にかなり混乱していて、命令モードから切り替えるのに多くの問題を抱えています。私は自分のプログラムに次のようなことをさせたいと思っています
いくつかの理由で私が言えることから、これは機能していません。'count'をリセットしないので、すべてのサブリストの値を合計すると、多分?これを回避する方法はありますか?私のベースケースも私が望むものではないかもしれません-私はそれが本当にどうあるべきかわからないだけですか?私はおそらく他のものも見逃しています...どんな助けでも大歓迎です!:) ありがとう!
prolog - 失敗による手動リスト反復と再帰を使用することの長所と短所は何ですか
私はいつもこれに立ち向かいますが、どの方法で攻撃すればよいかわかりません。以下は、いくつかのシーズン ファクトを処理するための 2 つの方法です。
私が解決しようとしているのは、方法 1 または 2 のどちらを使用するか、およびそれぞれの長所と短所、特に大量の事実です。
methodone
事実が利用可能であるため、わざわざそれらのリスト (特に大きなリスト) を作成するのは無駄に思えます。リストが十分に大きい場合、これにはメモリへの影響もあるはずです。また、Prolog の自然なバックトラッキング機能を利用していません。
methodtwo
私のために再帰を行うためにバックトラックを利用しています。メモリ効率がはるかに高いと思いますが、一般的にこれを行うのは良いプログラミング方法ですか? 従うのは間違いなく醜いです、そして他の副作用があるかもしれませんか?
私が見ることができる1つの問題は、呼び出されるたびfail
に、呼び出し元の述語に何かを返す能力を失うことです。だった場合methodtwo(SeasonResults)
、意図的に述語を継続的に失敗させるためです。そのmethodtwo
ため、状態を保存するにはファクトをアサートする必要があります。
おそらく(?)メソッド2は、(大きな)リスト処理を行う必要がないため、高速になりますか?
リストがあれば、それが進むべき道だと想像できmethodone
ます..またはそれは常に真実ですか?methodone
を使用してリストをファクトにアサートし、メソッド 2 を使用してそれらを処理することは、どのような状況でも理にかなっているでしょうか? 完全な狂気?
しかし、繰り返しになりますが、事実を主張することは非常に「費用のかかる」ビジネスであると読みました。そのため、大きなリストであっても、リストの処理が進むべき道でしょうか?
何かご意見は?または、(何の)状況に応じて、一方を使用して他方を使用しない方が良い場合がありますか?例えば。メモリの最適化には、事実のアサートを含む方法 2 を使用し、速度には方法 1 を使用しますか?
prolog - プロローグ: リストの一時保存
私は Prolog を初めて使用し、実行しようとしている述語に固執しています。その目的は、与えられた P を持つクワッド [X、Y、S、P] のリストを再帰することです。クワッドが同じ P を持っている場合、それは一時的なリストに格納されます。新しい P に遭遇すると、一時リストが長さ 2 より大きいかどうかを確認し、長さ 2 未満の場合は一時リストを出力リストに格納し、2 未満の場合はクワッドを削除し、再帰を再び開始します。新しいP.
私のコードは次のとおりです。
助けてくれてありがとう!
list - プロローグ: 最初の重複値
リスト内の最初の重複値を見つける必要があります。
prep(3,[1,3,5,3,5]).
本当のはずです。
prep(5,[1,3,5,3,5]).
偽でなければなりません。
重複が見つかるまで、現在の値と前のリストメンバーとの同等性をチェックすることを考えました。重複が見つかった場合は、X との同等性をテストしますが、Prolog でそれを行う方法がわかりません!
どんな助けにも感謝します!ありがとう
prolog - プロローグの「床屋は誰だ」ロジック パズル
レイモンド・スマリヤンの「モッキンバードをあざける」を読んでいます。この本には、次のようなパズルがあります。
この物語のセビリアとスペインの有名なセビリア (実際には存在しない) との類似点は、まったくの偶然です。この神話の町セビリアでは、男性の住民は気分が良い日だけかつらを着用します。一日中同じように振る舞う住民は 2 人もいません。つまり、男性が 2 人いる場合、そのうちの 1 人がかつらを着用し、もう 1 人が着用しない日が少なくとも 1 日はあるということです。男性の居住者 X および Y が与えられた場合、X が着用するすべての日、Y がかつらを着用する場合、居住者 Y は X の信奉者であると言われます。また、居住者 X、Y、および Z が与えられた場合、X と Y の両方が着用するすべての日に Z がかつらを着用する場合、居住者 Z は X および Y のフォロワーであると言われます。
住民のうち 5 人の名前は、アルフレッド、ベルナルド、ベニート、ロベルト、ラマノです。それらについて次の事実が知られています。
事実 1.. ベルナルドとベニートは、かつらをかぶる習慣が正反対です。つまり、いつでも、1 人はかつらを着用し、もう 1 人はかつらを着用していません。
事実 2: ロベルトとラマノも正反対です。
事実 3: ラマノは、アルフレドとベニートの両方がかつらを着用している日だけかつらを着用します.
セビリアにはちょうど 1 人の理髪師がいて、彼について次の事実が知られています。
事実 4: ベルナルドはアルフレッドと床屋の信奉者です。
事実 5: 男性の住民 X が与えられた場合、ベルナルドがアルフレドと X の信奉者である場合、理髪師は X のみの信奉者です。
アルフレドは黒のかつらのみを着用しています。ベルナルドは白いかつらだけを着用しています。ベニートは灰色のかつらのみを着用しています。ロベルトは赤いかつらのみを着用しています。ラマノは茶色のかつらのみを着用しています.
あるイースターの朝、理髪師がかつらをかぶっているのが見られました。彼は何色の服を着ていましたか?
Prologでこれを解決するのは楽しいだろうと思いましたが、かなり早く行き詰まってしまいました:
誰かが他の人をフォローしていることを効果的にエンコードする方法がわかりません。また、その情報に基づいて推論する方法もわかりません。Prolog で他のいくつかの論理パズルの解決策をたどりましたが、このパズルの解決策を見つけることができませんでした。
編集: Smulyanの本からコピーされたソリューションは次のとおりです。
ステップ 1: まず、Roberto が床屋のフォロワーであることを証明します。
理髪師がかつらを着用する日を考えてみましょう。その日、アルフレドはかつらをかぶるか、かぶらないかのどちらかです。Alfredo がそうだとしましょう。ベルナルドはアルフレドと床屋の信奉者であるため、その日はベルナルドもかつらを着用します。その日、ベニートはベルナルドとは反対なので、かつらをかぶることはできません。その日、ラマノはかつらをかぶることができません。アルフレドとベニートの両方がかつらを着用している日だけかつらを着用し、ベニートはこの日はかつらを着用していないからです。この日、ラマノはかつらをかぶらないので、ロベルトはラマノとは反対なので、ロベルトはかつらをかぶる必要があります. これは、床屋がかつらを着用する日はいつでも、アルフレドもかつらを着用する場合、ロベルトも着用することを証明しています.
では、理髪師がかつらをかぶっていて、アルフレードがかぶっていない日はどうでしょうか? まあ、アルフレドはそうではないので、アルフレドとベニートの両方がそうであるというわけではありません。したがって、事実 3 により、ラマノはかつらを着用せず、したがって事実 2 によりロベルトは着用します。したがって、ロベルトは床屋が行う日はいつでもかつらを着用し、アルフレドは実際には着用しません。彼は、アルフレドが着用しないすべての日にかつらを着用します。 t、床屋に関係なく。これは、床屋がかつらを着用する日はいつでも、その日にアルフレドがかつらを着用するかどうかに関係なく、ロベルトも着用することを証明しています. したがって、ロベルトは確かに理髪師の信奉者です。
prolog - この単純な例で Prolog がクラッシュするのはなぜですか?
こんにちは、上記は非常に単純なプロローグ ファイルで、いくつかの事実と 1 つのルールのみが含まれています。しかし、このファイルをロードした後、Prolog に次のクエリを依頼します。
プログラムがクラッシュします。その理由はlikes(john,john)
、ルールにX\=john
.
何かアドバイス?
prolog - リストから要素のすべての出現を削除する
値とリストを指定するプロシージャを作成しようとすると、作成したリスト内のその値のすべての出現が削除されます。
cut
このコードは次のようなクエリに正しく答えることができないため:
カットを削除すると:
次のようなクエリでは失敗します。
true
(正解が の場合、 を返しますfalse
)。
両方の状況で機能させるにはどうすればよいですか?
X is not T
コードの 3 行目で確認できるかもしれませんが、試してみました。
しかし、それは機能しません。
prolog - Prologでテキストロジックパズルを解く-誕生日と月を探す
「7日間で7つの言語」の本を読んでいて、Prologの章に到達しました。学習演習として、私はいくつかのテキストロジックパズルを解こうとしています。パズルは次のようになります。
5人の姉妹は全員、誕生日が異なる月に、それぞれが異なる曜日に誕生日を迎えます。以下の手がかりを使用して、各姉妹の誕生日が当たる月と曜日を決定します。
- ポーラは3月に生まれましたが、土曜日には生まれませんでした。アビゲイルの誕生日は金曜日でも水曜日でもありませんでした。
- 月曜日に誕生日を迎える少女は、ブレンダとメアリーよりも年の初めに生まれました。
- タラは2月に生まれておらず、彼女の誕生日は週末でした。
- メアリーは12月に生まれたわけでも、平日の誕生日でもありませんでした。6月に誕生日を迎えた少女は日曜日に生まれました。
- タラは、誕生日が金曜日ではなかったブレンダの前に生まれました。メアリーは7月に生まれませんでした。
私の現在の実装は、おそらく経験豊富なPrologプログラマーにとっては冗談のように見えます。コードは以下に貼り付けられています。
質問を解決する方法と、コードを明確かつ高密度にする方法について、いくつかの意見をお聞かせください。
すなわち:
- 日は一意である必要があるという制限を入力しないようにするにはどうすればよいですか。
- 月は一意である必要があるという制限を入力しないようにするにはどうすればよいですか。
- 誕生日の順序に関する制限を追加します。
更新chacからの回答に基づいて、パズルを解くことができました。同じレシピに従って、私たち(仕事中のプログラミング言語コンピテンシーグループ)も2番目のパズルを解くことができました。完全な実装と出力例をGitHubに要点として投稿しました。
prolog - SWIプロローグは終了しません
結果?- is_fakt(X)
の回答のリストを返すのに、いくつかの結果の回答の後にハングするのはなぜですか。PrologがXのすべての可能な値を返すことができない理由がわかりません。