問題タブ [prolog-setof]
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 - 他の関数から得られたすべての可能性で関数を実行する
私は2つの述語を持っています:
foo を実行した後、 Y のすべての可能性を指定して bar を実行するにはどうすればよいですか?
例:
これらすべての可能性でバーを実行するにはどうすればよいですか?
そして、すべての結果をZ
リストに保存しますZs
か?
prolog - プロローグ: 失敗によるループ
次の障害駆動ループを使用して、セミコロンを使用せずにすべてをリストしました。
クエリモードでは、期待どおりにこれを取得します
これらの数値を画面に書き込むのではなく、リストに挿入するにはどうすればよいですか? someGoal
バックトラッキングは暗黙のように見えるため、これを処理できませんでした。
prolog - プロローグ - オオカミ山羊のキャベツ
私は「オオカミ ヤギ キャベツ」という名前のパズル ゲームに取り組んでいます。プログラミング言語は Prolog です。
それを機能させるために、呼び出す length(X,7),wgc([w,w,w,w],X).
と結果が表示されます。問題は、最初の結果と 2 番目の結果が何度も表示されることです。
両方の結果を一度だけ表示する方法は? 追加してみた!wgc への記号:
...しかし、最初の結果は 1 回しか表示されません。それを修正する方法はありますか?
prolog - Prologでソリューションを繰り返さないでください
次の内容のデータベースがあるとします。
したがって、aとbはdとcの息子です。今、あなたは、誰が誰の兄弟であるかを、より大きなデータベースを考えて知りたいと思います。解決策は次のとおりです。
これに伴う問題は、「brother(X、Y)」と尋ねると、「;」を押し始めます 次のような冗長な結果が得られます。
- X = a、Y = b;
- X = b、Y = a;
- X = a、Y = b;
- X = b、Y = a;
これらの結果が得られる理由は理解できますが、これを修正する方法を探しています。私に何ができる?
prolog - 繰り返しの回答を防ぐ方法をプロローグする
私のプログラムの場合、ナレッジベースには次のようなアトミックステートメントとルールがあります
ex: 店舗(iPhone5, phone)
ex: メーカー(iPhone5、apple)
クエリは、2 つ以上の異なる製品タイプを製造している会社があるかどうかを調べるためのものです。したがって、Apple の場合、Macbook、iPad、および iPhone があります。
クエリは次のとおりです。
?- store(ItemID1, ProductType1), manufacturer(ItemID1, Company), store(ItemID2, ProductType2), manufacturer(ItemID2, Company), store(ItemID3, ProductType3), manufacturer(ItemID3, Company), not ProductType1 = ProductType2, not ProductType1 = ProductType3, not ProductType2 = ProductType3.
アップル製品を 3 つリストアップすると正解が出ますが、さらに押すと同じ答えが何度も出てきます。これを止める方法はありますか?
注: このサイトにある他の質問に対する他の回答は知っていますが、Prolog に関する知識が限られているため、それらの回答を実装する方法がわかりません。また、それらの回答がこの質問に当てはまるかどうかもわかりません。
注:この質問では!
->
、 and;
演算子の使用は許可されていません
prolog - すべての異なるパスをバックトラックせずに、Prolog に statisfying 句が存在するかどうかを確認する方法は?
私が次のものを持っているとしましょう:
ダイアンの兄弟を尋ねると、チャーリーとイブが 2 回見つかります。1 回はボブから、もう 1 回はアリスからです。私はそれぞれ一度だけ欲しい。
バックトラックを完全に防ぐため、ここでカットを使用できるとは思いません。私が望むのは、存在するかどうかを確認する方法です。
言い換え
いくつかのカットを試しましたが、うまくいきませんでした。結果のリストが空でないかどうか
を試しfindall/3
てみましたが、それはAまたはBを統一しません.(parent(X, A), parent(X, B))
setof/3
以下で提案されているように使用すると機能しますが、質問で使用するのではなく、 の定義に組み込む方法を本当に見つけたいと思っていますsibling/2
。私は本当に次のことができるようになりたいです:
またはこれ
以下で述べたように、この特定のケースに対する解決策があります。私が望んでいること、そして私が報奨金を設定しているのは、一般的な解決策です。
それ以外の
やりたい
A
とを一体化するものB
。
を定義するにはどうすればよいexists/1
ですか?
prolog - プロローグ - 失敗する代わりに空のリストを返す setof の実行方法
目標を満たすオブジェクトの順序付きリストが必要です。setof
は順序を処理しますが、ゴールを満たすオブジェクトがない場合は失敗します。代わりに空のリストを返したいのですfindall
。
これは機能しますが、カットせずにこれを達成する方法はありますか? SWI-Prolog を使用しています。
variables - 変数が空であるか、入力されているかを確認します
次の問題があります。
プロローグ プログ:
問題:
ゴール:
なぜこれが起こるのか理解していますが、それでもすべての人の名前を知りたい. したがって、私の解決策は、「Man」が初期化されているかどうかを確認することです。
「チェック」では、変数「Man」が満たされているかどうかをチェックするコードをスナイプする必要があります。
これは可能ですか?