0

ここでプロローグする初心者。課題の質問で私が抱えている混乱の一部を取り除くために質問したかっただけです。

事実のリスト(この場合、人々と彼らが食べる食べ物のリスト、およびアイテムの数)があるとします。

label(test,
  [eats(george,apple,3),
   eats(bob,orange,1),
   eats(joe,steak,1)]).

この配列内のファクトを使用するにはどうすればよいですか? たとえば、これを機能させるにはどうすればよいですか?

eaten(Person,Food):-
  eats(Person,Food,_).
4

2 に答える 2

1

文脈が不足しているため、あなたの質問はほとんど意味がないと思います。

事実のリストをDBにプッシュするための可能な使用法:

?- maplist(assert, [eats(george,apple,3), eats(bob,orange,1), eats(joe,steak,1)]).
true.

?- eats(Person,Food,_).
Person = george,
Food = apple ;
Person = bob,
Food = orange ;
Person = joe,
Food = steak.

繰り返しますが、残りのルールがすべてです...

編集通常、「情報の流れ」は逆です。DB ファクトから開始し、関連データをリストに収集し、リストを処理します。Daniel は、リストの要素へのアクセスについて説明しました。リストからファクトを表明した後、ルールがファクトにアクセスできるようになることを考慮してください。リストしたルールを使用して、次のことを行います。

?- retractall(eats(_,_,_)),
   maplist(assert, [eats(george,apple,3), eats(bob,orange,1), eats(joe,steak,1)]).

?- eaten(bob,X).
X = orange.

HTH

于 2013-03-28T23:21:45.907 に答える
1

私はあなたが求めているものを見ると思います。答えは、次のmember/2ように使用することです。

eaten(Person, Food) :- 
  label(test, Eating),
  member(eats(Person, Food, _), Eating).

これはあなたが望む結果ですか?

?- eaten(P, F).
P = george,
F = apple ;
P = bob,
F = orange ;
P = joe,
F = steak.

経験則として、そのような大きな塊にリストを格納するよりも、リストを渡す方がおそらくより「標準的」です。これは事実ではなくeats/3 構造のリストであると私はおそらく言うでしょうが、データベースにあるものは と呼ばれるアリティ 3 の事実のグループではなく、アリティ 2 の事実と呼ばれるため、この使用法の種類は区別をあいまいにします。しかし、それらは実際にはデータベースにあり、回り道をしています。面白い。labeleats

リストを突くために使用するこのアプローチはmember、プロシージャにオプションを提供するためにもよく使用されます。open/4たとえば、それを使用します。

于 2013-03-29T03:26:54.627 に答える