2

私はプロローグの初心者で、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が原因である可能性があります.
助けてくれてありがとう :)。

4

1 に答える 1

2

技術的には、findall/3 が失敗することはありません。どの呼び出しも成功しない場合 (例外は別として、Prolog がそれらを実装している場合) は空の結果リストで完了するためです。

もちろん、すべてのコードがなければ、あなたの質問に答えることは不可能です。structureそしておそらく、すべてのコードが利用可能になったとしても、あなたのプログラムのコードは推奨されるものよりも複雑に見えるため、助けがあったとしてもほとんど得られないでしょう。

Prolog はリレーショナル データ モデルを備えた言語であり、そのようなデータ モデルは、関係をきれいに保つことができる場合に適していますこれで、 16 個の引数を持つ述語ができました。それらすべてが正しく一緒に再生されるようにするにはどうすればよいでしょうか?

私は言うでしょう-デバッグに成功した場合は、プログラムの構造を変更しないでくださいしかし、次のプログラム (もしあれば) は別のスタイルを使用し、Prolog が提供する機能を使用してデータの隠蔽を実装します。

プレーンな古いプロローグには「のみ」複合用語がありました。コードはおそらく

  packman(CurrPackManState, CurrGhostsState, NextPackManState, NextGhostsState) :-
    ...

ここで、CurrGhostsState は CurrGhostState のリストである必要があり、このリストの各要素は適切な構造で統合され、位置、色、形状などに関する情報が隠されている必要があります...

SWI-Prolog にはdictsが追加され、どの Prolog でも DCG を使用してコードの複雑さを軽減できます。Markus Triska のこのページを参照して、「暗黙的に状態を渡す」を探してください。

また、アサート/リトラクトを使用して、更新頻度の低い情報 (迷路構造など) をグローバル データベースに配置することもできます。

于 2014-04-10T06:21:54.440 に答える