問題タブ [prolog]
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 - gprolog で述語動的を宣言する
私はPrologにこのコードを持っています:
しかし、私はまだこのエラーが発生します:
goto(foo) を実行すると。
動的ドキュメントを読みましたが、少なくとも gprolog では、その使用方法がわかりません。何か不足していますか?
prolog - Prolog で述語へのすべてのソリューションを取得する
Prolog でテキスト アドベンチャー ゲームを作成しており、部屋の出口を出力しています。私は次のようなコードを持っています:
ここで、connected/2 は次のとおりです。
パスは次のとおりです。
等々。
ただし、部屋の出口を印刷しているときは、最初に取得し、次に「;」が必要です。別の解決策が欲しいと言う。とにかく述語に結果を完全に計算させて、プレーヤーがさらに終了を要求し続ける必要がないようにする方法はありますか?
algorithm - 最適な「最も一般的な単一化」アルゴリズムは何ですか?
質問
最も効率的な MGU アルゴリズムは何ですか? その時間複雑度は? スタックオーバーフローの回答で説明するのは簡単ですか?
Google で答えを見つけようとしていますが、ACM サブスクリプションを介してのみアクセスできるプライベート PDF を見つけ続けています。
SICP で 1 つのディスカッションを見つけました: here
「最も一般的な統一アルゴリズム」とは何かについての説明: 「自由変数」と「定数」を含む 2 つの式ツリーを取得します。たとえば、
次に、Most General Unifier アルゴリズムは、2 つの式を同等にする最も一般的なバインドのセットを返します。例えば:
「最も一般的な」とは、代わりに{x ↦ 1}
and {z ↦ 1}
and をバインドできることを意味しますが、それはe1
and とe2
同等になりますが、より具体的になります。
SICP の記事は、それがかなり高価であることを暗示しているようです。
情報については、私が尋ねている理由は、型推論にもこの「統一」アルゴリズムが含まれていることを知っており、それを理解したいからです。
prolog - 有向グラフの葉ノード - Prolog
Prologでリーフノードのリストを取得する方法を知っている人はいますか?
たとえば、これらの有向辺で記述される単純な有向グラフがあるとします。
では、グラフを再帰的にブラウズし、それら 2 つのリーフ ノード (ノード 1 と 5) のリストを作成する方法は?
答えてくれてありがとう!
編集:
さて、私は最初の述語を書いて動作させています:
しかし今、グラフをトラバースしてリーフノードの出力リストを書き込む方法がわかりません。私は知っています、それはとても簡単ですが、私はこの考え方とプログラミングの経験がありません:(
.net - .NETに最適なAI言語/フレームワークは何ですか?
私はターン制ストラテジーゲームで構成される学術作品を構築しています。グラフィックにXNA3を使用していますが、AIに何を使用するかを決めていません。
.NET用のPrologインタープリターであるP#の使用を検討していましたが、少し貧弱でした。ゲームAIにとって、Prolog(おそらくHaskell?)よりも優れたもの、またはP#よりも優れたインタプリタはありますか?
prolog - プロローグ述語の問題
私は Prolog を使い始めたばかりで、次のコードが期待どおりに機能しない理由がわかりません。リスト L2 が L1 に含まれている場合に true を返す述語を作成しようとしています。これは私が書いたものです:
これは、「'L3=X|L2' の X が L1 にあり、L2 が L1 にある場合は true」と同等であり、contains(L1, L2) は、すべてのメンバーがトラバースされるまで再帰的に変換されると考えました。最後のオプションが残っています。そうしないと、L1 にないメンバーが見つかり、述語が失敗します。
残念ながら、そのようには機能しないようです。member(X, L1) の値のみを返すように見えるので、contains([1,2,3],[1,4,5]) はパスしますが、contains([1,2,3],[4, 1,5]) しません。
私は何を間違っていますか?
.net - .Net 用 Prolog コンパイラ
誰でも .Net 用の Prolog コンパイラを推奨できますか?
私がネットを検索して見つけたものは、数年間更新されていないようです。
ありがとう
シラーズ
prolog - このProlog述語が機能するのはなぜですか?
次のコードがあります。このコードはリストで機能しますが、これらのリストはセットを表すため、[1,1,2,2,3,3]と[1,2,3]は同等である必要があることに注意してください。
equals([1,2,3]、[1,2,1,3])はtrueを返す必要があるという考え方です。ただし、上記の定義に基づいて、私が予想することは次のとおりです。
- equals([1,2,3]、[1,2,1,3])は最初のルールに一致し、equals([2,3]、[2,1,3]])を呼び出します。
- equals([2,3]、[2,1,3]])は2番目のルールに一致し、contains([2,3]、[2,1,3])、contains([2,1,3]、 [2,3])。
- contains([2,3]、[2,1,3])は失敗し、equalsはNoを返します。
それでも、それはまだ機能します。そして、それを混乱させる他の試みもそうです。誰かが私にそれを説明してもらえますか?
(Prologの実装:SWI-Prologバージョン2.7.12)
prolog - PROLOGルールは最初の一致のみを返します
私はPrologでfindall述語を実装しようとしています(そうです、それが組み込まれていることは知っています、これは割り当て用です)。
それは次のように書かれています:
何らかの理由で、my_findallへの2番目の呼び出しが失敗したかのように、最初の解決策が得られ、そこで停止します。私が理解しているように、バックトラッキングメカニズムは、Pred(N、P)を呼び出すためのすべてのオプションを含む、すべての可能なオプションを調べる必要があります。したがって、2番目の呼び出しは最初の試行で失敗するはずです(Predに対して試行された最初のオプションはすでに主張されている)、それはあきらめてmy_findall((、)、_、[])に行く前に、最初に他のすべてのオプションを試す必要があります。
それが機能しない場合、ソリューションを完全に書き直すことなく、この種の動作を強制する方法はありますか?
c# - C# プログラマーのための Prolog、Haskell の学習が必要
私は C# プログラマーであり、関数型プログラミングと宣言型プログラミングに関するいくつかの素晴らしい議論を経てきました。私はどちらも苦手だと思っています:Pなので、prologとhaskellの学習を始めようと思っていました。そうすることの実現可能性について提案してください。もし私が F# を学べば、Haskell を学ぶ意味はありますか? これらの言語は、より優れた C# プログラムを作成するのに役立つ、どのような資質を提供してくれるでしょうか?