0

いくつかのリスト(メニュー)を1つずつ返す述語「lookupOptions」があります。

複数入力の場合に対応できるようにしようとしています。「list_places」リストの先頭を読み取ることで、次のように1セットのオプションを返すことができます。

find_options(Restaurant,Town,Menu) :- lookupOptions(Restaurant,H,Menu), list_places(Town,[H|T])

しかし、私はそれを繰り返すことができません。

私はたくさんのことを試みました、これらはこれまでの私の最善の努力でした。

a)十分に標準的な反復ですが、解決されません...

doStuff(X,[],_).
doStuff(Restaurant,[H|T],_):-  lookupOptions(Resturant,H,_), doStuff(Restaurant,T,_).
find_options(Restaurant,Town,Menu) :- doStuff(Restaurant,[H|T],Menu), list_places(Town,[H|T]).

b)目標述語を拡張する..。

find_options(_,Town,[H|T],_)
find_options(Restaurant,Town,Menu) :- find_options(Restaurant,Town,[],Menu).
find_options(Restaurant,Town,X,Menu) :- list_places(Town,X).
find_options(Restaurant,Town,[H|T],Menu) :- lookupOptions(Restaurant,[H],Menu), find_options(Restaurant,Town,T,Menu).

これらのどちらかが機能しますか?パターンが正しく書かれている場合。または、適切なカットが行われた場合はどうなりますか?

最も感謝している助けは...

4

1 に答える 1

1

を繰り返したいかは明確ではありません。Prologはバックトラッキングを使用してすべての代替案を調べます。代替案を探している場合はバックトラックを開始するか、すべてのソリューションファミリを使用する必要があります。

今、私はあなたが単にもっとあるかもしれないと宣言したいと思いますfind_options(Restaurant,Town,Menu)[H|T]次に、ヘッドマッチを次のように置き換えてみてください。

find_options(Restaurant,Town,Menu) :-
   lookupOptions(Restaurant,H,Menu),
   list_places(Town, Places),
   member(H, Places).

ところでT、元のルールではシングルトンです。これは、それを一般化する必要性のヒントになる可能性があります。

于 2012-11-04T08:02:13.743 に答える