2015-11-01 58 views

回答

1

提供不會解釋是考慮一個壞格式的count謂詞的代碼。您應該將其重寫爲count:-而不是count():-。據我所知,所有零元謂詞都需要像這樣定義。

其次,您的計數謂詞不會收集您可以操作的列表中的結果。這裏是你如何改變它收集在一個列表中的所有部門,量對與findall

count_sum(DepAmounts):- 
    findall((Department,Sum), 
      ( productionPlan(FinishedProduct, Amount), 
       resultOf(FinishedProduct, Operation), 
       executedIn(Operation, Department, Time), 
       Sum is Amount * Time 
      ), 
      DepAmounts 
    ). 

然後,在列表中,你可以使用像SWI-Prolog的的aggregate

?- count_sum(L), aggregate(sum(A),L,member((D,A),L),X). 

哪將產生,通過回溯,部門d和數量的X總和:

D = a, 
X = 15 ; 
D = b, 
X = 20 ; 
D = c, 
X = 80. 

順便說一句,如果我是你,我會更換爲去所有雙引號字符串爲簡單起見,原子的名稱和操作等。

+0

謝謝。你真的很有幫助,但它只返回第一個結果 –

+0

對不起,我的壞。修好了,非常感謝! –

0

你應該考慮庫(aggregate):例如,調用數據/ 2有趣的DB子集,你會得到

?- aggregate(set(K-A),aggregate(sum(V),data(K,V),A),L). 
L = [a-5, b-20, c-80]