問題タブ [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.
recursion - Prolog で X のすべてのリストを検索するプログラム
Prologの学習を始めています。このプログラムは、指定された要素のすべての出現を取得しようとします:
しかし、ここにエラーがあります:
prolog - 用語の平等/不平等の具体化
きれいな方法で項の等号と不等号を区別する純粋な Prolog プログラムは、実行の非効率性に悩まされます。関連性のすべての用語が根拠がある場合でも。
SO の最近の例はthis answerです。この定義では、すべての答えとすべての失敗が正しいです。検討:
このプログラムは宣言的な観点からは完璧ですが、B、SICStus、SWI、YAP などの現在のシステムで直接実行するのは不必要に非効率的です。次の目標では、リストの各要素に対して選択ポイントが開いたままになります。
これは、次のように s の十分に大きなリストを使用することで確認できa
ます。I
リストを表示できるように を調整する必要がある場合があります。SWI では、これは次のことを意味します。
1mo はI
、次のようなグローバル スタックのリソース エラーを防ぐのに十分小さい必要があります。
2do はI
、ローカル スタックのリソース エラーを引き起こすのに十分な大きさである必要があります。
この問題を克服し、優れた宣言型のプロパティを維持するには、比較述語が必要です。
この比較述語はどのように定義する必要がありますか?
考えられる定義は次のとおりです。
編集:おそらく、ISO組み込みと同様に引数の順序を逆にする必要がありますcompare/3
(ドラフトのみへのリンクリンク)。
それを効率的に実装すると、最初に高速で確定的なケースが処理されます。
X \= Y
編集:制約がある場合に適切なガードであるかどうかは明確ではありません。制約なし、?=(X, Y)
またはX \= Y
同じです。
例
@ user1638891 で提案されているように、このようなプリミティブの使用例を次に示します。マットによる元のコードは次のとおりです。
次のように書き換えることができます。
SWI の 2 番目の引数のインデックス作成は、 のようなクエリを入力した後にのみ有効になることに注意してくださいoccurrences(_,[],_)
。(;)/2
また、SWI は、選言にインデックスを付けないため、本質的に非単調な if-then-else を必要とします。SICStus はそうしますが、最初の引数のインデックス付けしかありません。したがって、1 つの選択ポイントが開いたままになります (最後に が付き[]
ます)。
prolog - \==/2またはdif/2を使用する
2つの変数が同じ用語にインスタンス化されないようにしたい場合、それを行うための好ましい方法は何ですか?
グラフで有向エッジを見つける必要があり、ノードがそれ自体にエッジを持つことができないとしましょう。
(ここでのエッジはa-> c、b-> aですが、c-> cではありません)
次の作品:
これも機能します[swi-prolog]:
これは明らかに機能しません(AもBもまだインスタンス化されていないためですか?):
最初の解決策に関する私の問題は、より複雑なnode
述語では、失敗する前に多くの不必要な統合が行われる可能性があることだと思いedge
ます。一方dif
、ライブラリ内にあるため、このような単純なケースで使用することを意図したものではないことを示しています(ただし、私が探しているように見える正確な機能を備えています)。
prolog - プロローグのガード条項?
それらは存在しますか?それらはどのように実装されていますか?
SWI-Prolog(、など)のcoroutining述語には、ガードの機能があります。それらは、好ましいPrologプログラミングスタイルにどのように適合しますか?freeze
when
dif
私は論理プログラミング(Prologとまったく)に非常に慣れておらず、それが純粋に宣言型ではなく、非常に単純な場合でも手続き上の考慮が必要であるという事実に多少混乱しています(またはの使用に関するこの質問を\==
dif
参照してください)。重要なものが欠けていますか?
prolog - Prolog の再帰は内部からどのように機能しますか。一例
要素のリストをセットに変換する小さなスクリプトを用意しました。たとえば、リスト [1,1,2,3] -> [1,2,3] を設定します。手順の中で何が起こっているのか、順を追って説明してもらえますか? [1,1,2,3] -> [1,2,3] の例を使用していただけますか?
prolog - Prolog に変数の一意の値を選択させる
OK、私はPrologを初めて使用するので、これが些細なことである場合は申し訳ありませんが、これに対する適切なエレガントな答えを見つけることができないようです. 私はここでlearnprolognow.orgの演習2.4(クロスワード)を解決しようとしています。
この演習では、次の事実が提供されます。
そして、各単語のクロスワード配置を解決するために私が思いついた解決策は次のとおりです。
V1a
toV1g
などは各単語の文字であり、toV1bH1b
はV3fH3f
クロスワードの単語間で共通する文字です。
解決策は機能しているように見えますが、結果は重複した値を生成しています。最初の結果は次のとおりです。
Prologに強制するにはどうすればよいV1 \= V2 \= V3 \= H1 \= H2 \= H3
ですか? 1つずつ個別に行うと、120個の順列が必要になるため、より迅速な方法が必要であり、これは初心者の演習であるため、何かが欠けているに違いありません.
この同様の質問を見つけましたが、提供された回答は非常に複雑に思えます。もっと簡単な方法があることを願っています。念のため、Ubuntuでswi-prologを使用しています。
ありがとう。
prolog - プロローグ式の順序を設定する
私のPrologプログラムblanket(X,Y)
には、Xが特定の種類のYのセットに含まれているかどうかをチェックするというルールがあります。
- Yの両親
- Yの子供たち
- Yの共同養育
私はそれを次のように定義しました:
ただし、これは期待どおりに機能しません。Xの親、子、および共同養育者(存在する場合)を正しく識別しますが、それ自体を親と共同養育者の両方としてリストします。これは私が望んでいないことです。different(Y,X)
評価が最初に独立して行われるように、ある種の順序を設定することは可能ですか?もちろん、 :のようなものを試しましdifferent(Y,X),(parent(Y,X);child(Y,X);coparent(Y,X)).
たが、まだ言語に慣れていないため、構文エラーが発生します。
任意の提案をいただければ幸いです。
編集:ここに、、、child
およびdifferent
関係coparent
があります:
完全を期すために。
prolog - CUT を完全に理解するための簡単なプロローグ コードのトレース (!)
ـــــــــــ
まず、カットを使用せずにこのコードを書き、次に完璧な答えが得られるまで各述語の後にカット演算子を配置しようとしましたが、実際にはカットを使用した後の動作がわかりません。カット演算子がプロローグのマッチングの進行を停止することは知っていますが、正しく使用できないため、このコードをトレースするのに役立ちます。このコードは、リスト内の要素のすべての出現を単純に削除します。
prolog - リストから要素を削除する
この質問はすでに聞かれていることは知っていますが、私の具体的な実装について聞きたいだけです。Prolog を練習し、Prolog をよりよく理解するために、この関数を作成しています。ここに私が持っているものがあります:
アイデアは、New
削除したい要素が と等しくない場合に呼び出される新しいリストに要素を追加するというものH
です。私が理解していることから、要素 where に到達するとコードが停止するため、コードが機能していませんEle \= H
。これを修正する方法はありますか?
たとえば、del(5, [3,4,5,6,7], X)
false を返します。
また、より良い解決策はありますか?リスト内のすべての要素を新しいリストに追加し続けるのは、悪い解決策のように思えます。これは、大きなリストの場合は遅くなるからです。現在リストにある要素を保持し、一致する要素を見つけ、Ele
その要素を削除してから、リストを返すだけです。