2012-10-23 45 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是求和谓词,我将离开你;它应该与其功能对应物非常相似。