1

私はこの問題で立ち往生しています...

isAt(keys, room3).
isAt(book, room3).
isAt(keys, room6).
isAt(keys, room4).

現在、room3には鍵と本があります。キーと本を印刷したい。このコードを試してみたところ、明らかに1つしか出力されません。(キーのみ)

look :- isIn(Location),
  write('You are in '),
  write(Location),
  nl,
  items_inroom(Location),
  nl.


items_inroom(Location) :-
    isIn(Location),
    isAt(Item, Location),
    write('Available Item(s):'), 
    write(Item),
    nl.

items_inroom(_) :-
    write('Available Item(s): None'),
    nl. 

items_inroom は、これらすべての事実を印刷しようとするコードです。どうすればこれにアプローチできますか?どんな助けでも素晴らしいでしょう!ありがとうございました。

4

3 に答える 3

0

items_inroom/1predicate は常にItemon all factの最初の出現を出力しますisAt/2。すべての事実をループするか、 metapredicateをisAt/2使用するか、 @Boris のように推奨するか、独自の bucle を作成する必要があります (最善のアイデアではないかもしれませんが、オプションです)。setof/3bagog/3findall/3setof/3

show_items(Location):- isAt(Item, Location),   % Condition
                     write(Item), nl,          % Process result
                     fail.                     % force backtracking to evaluate condition and find a new result
show_items(_).                                 % return true when all options have been evaluated
于 2015-06-22T15:35:20.473 に答える
0

すべてのアイテムを検索して表示します。

items_inroom(Location) :-
    write('Available Item(s):'),
    findall(Item, isAt(Item, Location), Items),
    show_items(Items).

show_items([]) :-
    write('None'), !.

show_items(Items) :- 
    write(Items).

実際にはshow_items(Items)、任意の方法で実装できます。

于 2015-06-20T04:41:17.597 に答える