0

この showName クエリは一連の名前を提供します。

?- showName(SName,Fname).
SName = 'McBrien',
FName = 'Alex' ;
SName = 'Gardner',
FName = 'Daniel' ;
SName = 'Phillips',
FName = 'Abbas' ;
SName = 'Pietzuch',
FName = 'Paul'  

and so on as I keep pressing ; it will gives more names.

という別の関数を書く必要があります

nameList (List). %which will put all names by query showName into List as a tuple
                  ((SName1,FName1),(SName2,FName2), ... )

Prologライブラリ(リスト)を使わずに試してみたい。ありがとう..

4

1 に答える 1

1

ファクトデータベースが次のようなものであると仮定します

person('Alex', 'McBrien', male).
person('Daniel', 'Gardner', male).
person('Abbas', 'Phillips', male).
person('Paul', 'Pietzuch', male).

findall/3重複がなければ、追加の計算コストは​​かかりますが、アキュムレータを使用せずに実行できます。アキュムレータにアイテムを追加する必要があるのは、それがまだメンバーになっていない場合のみです。

nameList(List):-
  nameList([], List).

nameList(IList, List):-
  (
   call(person(FName, SName, _)),
   \+ (member((SName, FName), IList))
  )-> nameList([(SName, FName)|IList], List) ; List=IList.

プロシージャは、空のアキュムレータnameList/1で呼び出すだけです。nameList/2次に、プロシージャnameList/2はファクト データベースからすべての人を呼び出し、その人がアキュムレータ リストに含まれているかどうかを確認します。そのような人物が 1 人見つかった場合、再帰的に自分自身を呼び出して、この人物をアキュムレータに追加します。入力リストにない人が見つからない場合は、このアキュムレータを人の出力リストと統合します。

于 2012-12-06T13:55:55.230 に答える