2011-02-12 50 views
0

我是Prolog中的新成員,並且遇到問題。我有以下事實:關於事實和列表的序言中的查詢

_________________ 
likes(a,apple). 
likes(a,banana). 
likes(a,orange). 
_________________ 

和我的查詢將是:

counts(a,Var). 

其中Var = [apple,banana,orange]。我不想以這種方式

Var=apple ; 
Var=banana; 
Var=orange; 

任何建議或幫助將不勝感激。提前致謝。

+0

什麼做你想得到什麼?是喜歡蘋果/香蕉/橘子的人數嗎? – Asterisk 2011-02-12 07:22:58

回答

1

我會求助於萬能的findall/3解決您的問題。

?- findall(Fruit, likes(a, Fruit), Fruits), length(Fruits, N). 

Fruits = [apple,banana,orange] 
N = 3 

所以你counts(a, Var)只是一個findall/3調用(即使它確實收集的,而不是計數):

counts(Person, Fruits) :- findall(Fruit, likes(Person, Fruit), Fruits). 

,你會得到的結果如下:

?- counts(a, Var). 

Var = [apple,banana,orange] 
0

如果我理解你正確,你想要統計像列表一樣的實體的數量。所以,那麼代碼會是這樣的:

likes(a,apple). 
likes(a,banana). 
likes(a,orange). 

counts(a, [_], 1). 
counts(a, [H|T], Count) :- likes(a, H), counts(a, T, Count1), Count is 1 + Count1, !.