2012-10-23 44 views
2

在gnu Prolog中,我試圖在學院顧問程序中收集所有大學學分的總和。Prolog數字不在列表中的總和

目前,它返回類似這樣的積分數:

| ?- totalCredits(joe, X). 

X = 3 ? ; 

X = 3 ? ; 

X = 3 ? ; 

X = 1 ? ; 

X = 3 ? ; 

X = 3 ? ; 

no 

這是代碼示例:

totalCredits(Student, Credits) :- 
    class(Class, _, _), 
    creditFor(Student, Class, _), 
    class(Class, _, Credits). 

所以我的問題是如何能我總結了所有這些成績的?我對prolog完全陌生,以前只使用過功能語言,所以也許我完全錯過了某些東西。

+0

「class/3」的第二個參數是什麼?這可能會影響結果(並使當前答案無效)。 – false

+0

類的第二個參數是類的字符串名稱(用於打印輸出的美觀效果)。 – lildigiman

+0

然後它很好。如果第二個參數可能是,例如它用於的課程(例如CS爲2個學分,Math爲1個學分),則需要一些預防措施來避免重複計數。 – false

回答

0

你可以信用collect a list然後sum它:

totalCredits(Student, Total) :- 
    findall(Credits, creditFor(Student, _Class, Credits), ListOfCredits), 
    sum_list(ListOfCredits, Total). 

編輯評論後,修正:加入了關係!

totalCredits(Student, Total) :- 
    findall(Credits, 
    (creditFor(Student, Class, _), 
    class(Class, _, Credits)), ListOfCredits), 
    sum_list(ListOfCredits, Total). 
+0

不幸的是,creditFor分別包含學生姓名,班級和年級。班級的學分由班級(班級名稱,班級名稱,學分)確定。 – lildigiman

+0

對不起,我會進行更正... – CapelliC

+0

工程就像一個魅力。謝謝! – lildigiman

0

使用findall獲得所有學分,然後加以總和。

findall(C, creditFor(Student, _, C), Credits), 
sum(Credits, Sum). 

(我希望我理解正確的creditFor謂詞的意思)

這裏,sum是求和謂詞,我將離開你;它應該與其功能對應物非常相似。