проблема со списками в прологе - PullRequest
1 голос
/ 23 марта 2011

У меня есть проблема, которая сводит меня с ума !!! Я хочу посчитать средние оценки некоторых студентов по их идентификатору. Я написал код ниже, но он складывается после первого расчета:

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]]. Может ли somenone помочь ?????

Pleaseeeee !!!!

Есть идеи, как отсортировать этот список по avg?

1 Ответ

1 голос
/ 23 марта 2011

Рассмотрим переписывание find_all_avgs / 3 в качестве типичного рекурсивного предиката (базовый случай + рекурсивный шаг). Базовый случай может быть, когда первый параметр (список студентов) представляет собой пустой список.В этом случае результатом также будет пустой список.Класс рекурсивного шага - это тот, который занимает голову входного списка, вычисляет среднее значение по студенту для этого студента, а затем вычисляет остальные средние значения (рекурсия).Обратите внимание, что вычисленное среднее может быть помещено в качестве заголовка выходного списка вместо использования 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]):-
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...