prolog中列表的问题

时间:2011-03-23 10:30:38

标签: prolog

我有一个让我疯狂的问题! 我想用他们的身份来计算一些学生的平均成绩。我编写了下面的代码,但它在第一次计算后堆叠:

list_sum([], 0).

list_sum([Head | Tail], TotalSum) :-
    list_sum(Tail, Sum1),TotalSum is Head + Sum1.

find_student_avg(Student,Year,Avg):- 
    findall(X, grades(_,student(id(Student),_,_,_,_,_),year(Year),normal(X)), L),
    %% not(resit_grades(_,student(id(Student),_,_,_,_,_),_,_)),
    list_sum(L,Sum), 
    length(L,N), N>0, 
    Avg is Sum / N.

find_all_avgs([Head|Tail],Year,L):-
    find_student_avg(Head,Year,Avg),append(L1,[Head|Avg],L),find_all_avgs(Tail,Year,L2).

我的结果需要L=[[id1|avg1],[id2|avg2],[id3|avg3]]。有人可以帮忙?????

Pleaseeeee !!!!

有关如何按平均排序此列表的想法吗?

1 个答案:

答案 0 :(得分:1)

考虑将find_all_avgs / 3重写为典型的递归谓词(Base case + recursive step) 基本情况是第一个参数(学生列表)是一个空列表。在这种情况下,结果也是一个空列表。 递归步骤clasuse将采用输入列表的头部,计算该学生的学生平均值,然后计算其余的平均值(递归)。请注意,计算出的平均值可以作为输出列表的头部而不是使用append / 3。

因此,结果谓词将是:

find_all_avgs([],_,[]).   % Base case
find_all_avgs([Head|Tail],Year,[[Head,Avg]|L]):-
    find_student_avg(Head,Year,Avg),
    find_all_avgs(Tail,Year,L). % Recursion step

此谓词产生的形式为L = [[Student1,Average1],....,[StudentN,AverageN]],这与您所述的不同。但是,我相信这将是正确的输出格式。

如果你真的需要其他输出格式,那么第二个子句的头部应该是

find_all_avgs([Head|Tail],Year,[[Head|Avg]|L]):-