問題タブ [prolog-findall]
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 で findall または assert/retract を使用せずに、要素をリストに追加したり、知識ベースからそれらを計算したりするにはどうすればよいですか?
次のようなファイル「students.pl」に学生データベースで構成されるナレッジベースがあります。
「findall」または assert/retract を使用せずに、ナレッジ ベースから各学生の述語にアクセスし、各科目の平均点または平均パーセンテージを計算したいと考えています。次のようにバックトラッキングを使用したい場合があります。
このアプローチでは、各要素にアクセスして書き込むことができますが、各「パーセント」値を要素としてリストに追加するか、「Percent1 is Total + Percent」のような述語を使用してパーセント値を合計してから見つける場合その平均、どうすればそうできますか?ナレッジ ベースは非常に大きいため、findall やrettract/assert を使用したくないことに注意してください。
どんな助けでも大歓迎です。
prolog - Prolog findall/3: 複数のバッグ
Fox and Geese タイプのゲームの AI を書いています。私の述語の1つは次のようになります。
ゲームの状態を取り、キツネで動きます。結果の状態は で統一されNextState
、実際の動きは で統一されPegList
ます。すべてが期待どおりに機能します。
すべての動きの効用スコアを計算していますNextState
。効用スコアが最も高い州を見つけられるようにするためfindall/3
に、リスト内のすべての州を取得してから、それらの効用スコアを比較します。
最大の効用スコアを見つけることで、最高の効用スコアを持つものNextState
(およびリスト内の位置) を知ることができます。問題が 1 つだけあります。現在、どの移動が に行われたかを推測する述語を書いていませんNextState
。たとえば、次のようになります。
そのような述語を書く代わりに、私はfindall/3
or と同等のものを使用したいと思います。私の質問は、2 つの異なるリストで 2 つの異なる変数を取得する方法があるかどうかです。私は次のように考えています(うまくいった場合):
findall/3
そのような機能を2 回実行したり (醜いオーバーヘッド)、そのgetMove(+PrevState, +NextState, -PegList)
述語を記述したりせずに実装できますか?
list - Findall で生成されたリストから重複を削除する
誰がメールを送受信したかという非常に単純なデータベースを考え出すことで、Prolog を実践しています。
findall
事前に指定された の受信者を使用してリストを作成しましたX
。
prolog - Prolog findall/3
いくつかの事実を含む述語 pred があるとします。
findall/3 を使用して、パターン マッチ可能なすべてのファクトのリストを取得できますか?
たとえば、私が持っている場合
pred(a, _, _)
入手したい
[pred(a, b, c), pred(a, d, f)]
csv - プロローグし、csv ファイルを読み込んで述語を作成します。見つける
SWI-Prolog を使用しています。
一番上の行がプローブで、各行がサンプルである csv ファイルがあります。
実際のファイルには、20,000 を超える列 (「プローブ」) と 150 行 (「サンプル」) しかありません。
各関係を抽出し、それらを事実として別のファイルに出力したいと考えています。
例えば:
これまでの私のコード:
これはうまく機能しているように見えますが、機能しないか、findall で使用できないほど遅いです。
何が問題なのですか?
助けてくれてありがとう。
アップデート
お返事ありがとうございます。
私は定義しました:
したがって、ストリームではなく開いているファイルがあり、現時点では Functor 変数は不要です。
maplist をどのように使用したか混乱していますか? そして、私はそれをうまく機能させることができません。
私が試してみました:
としても:
しかし、どちらも失敗します。
prolog - パックマン netlogo ゲームのリストを持つ Findall
私はプロローグの初心者で、netlogo とプロローグを使用して pacman を単独で動かそうとしています。これは私のコードの一部です:
walkfront(_,_,_,_,_,_,Pacman,DirP,Lab,Ghost,_,Pellet,_,_,Decision) :-
findall(Dir,
( member(Dir,[0,90,180,270]),
\+ ( member((G,false),Ghost), dangerous(Pacman,G,2,Dir,_) ) ),
L),
findall(Dir,(member(Dir,[0,90,180,270]),(member(P,Pellet))),T),
chooseNotDangerous(L,Pacman,DirP,Lab,Dir,T)
walkfront(_,_,_,_,_,_,Pacman,DirP,Lab,Ghost,_,Pellet,_,_,Decision)
この行には、netlogo から取得したすべての情報のリストが含まれています。Pacman は pacman の位置 (x,y)、DirP は pacman が向いている方向、Lab は迷路内の空きスペース、Ghost はその位置です。 Ghosts (x,y,eaten?), Pellet はペレットのすべての位置のリスト (x,y), Decision は pacman によって選択された出力です.
最初の findall は、ゴーストがなく、危険でないすべての方向 (Dir) を提供し、それらを L というリストに保存することに
なっています。
私の質問は、私のコードが何らかの理由で機能していないため、このfindallが正しいかどうかです.2番目のfindallが原因である可能性があります.
助けてくれてありがとう :)。
prolog - Prolog で findall/3 を使用せずにクエリに一致するものをすべて検索する
データベースが与えられ、述語を使用してデータベースにクエリを実行しています
私は自分のデータベースを次のように持っています。
標準のfindall/3
述語を使用する代わりに、独自の findall を使用したいのですが、
常にデータベースの先頭に移動する再帰を使用すると、findmin を再帰的に使用してデータベース内の個別のオカレンスを取得する方法がわかりません。
prolog - swi-prolog の findall/3 が変数バインディングを無視するのはなぜですか?
次のコードは、これらの結果を示します。
しかし、すべての要素が同じバインドされていない変数 (a ではなく) を共有するようにしたい場合、想定どおりに動作しません。
_G1918、_G1912、および _G1906 が互いにバインドされないのはなぜですか? それはswi-prologのバグですか?