我在SWI Prolog上創建了一個簡單的數據庫。我的任務是根據生產計劃來計算每個部門的工作時間。我差不多完成了,但我不知道如何總結我的結果。至於現在我得到這樣的事情SWI Prolog使用聚合
部門數量
B 20
Ç50
下30
我怎麼能轉換到這個?
B 20
C 80
我的代碼https://gist.github.com/senioroman4uk/d19fe00848889a84434b
我在SWI Prolog上創建了一個簡單的數據庫。我的任務是根據生產計劃來計算每個部門的工作時間。我差不多完成了,但我不知道如何總結我的結果。至於現在我得到這樣的事情SWI Prolog使用聚合
部門數量
B 20
Ç50
下30
我怎麼能轉換到這個?
B 20
C 80
我的代碼https://gist.github.com/senioroman4uk/d19fe00848889a84434b
提供不會解釋是考慮一個壞格式的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.
順便說一句,如果我是你,我會更換爲去所有雙引號字符串爲簡單起見,原子的名稱和操作等。
你應該考慮庫(aggregate):例如,調用數據/ 2有趣的DB子集,你會得到
?- aggregate(set(K-A),aggregate(sum(V),data(K,V),A),L).
L = [a-5, b-20, c-80]
謝謝。你真的很有幫助,但它只返回第一個結果 –
對不起,我的壞。修好了,非常感謝! –