Как получить доступ к определенному элементу факта в списке в прологе

Структура фактов такова.

  %structure
 student(ID,FirstName,LastName,[courseList]).
 course(CourseCode,CourseTtile,Credits,Level).

Далее факт.

 student(20135639,'Mohammed','Abdul Wahab',
 [course('ITIS411','DATABASE SYSTEM IMPLEMENTATION',3,hard),
 course('ITIS412','INFORMATION SECURITY',3 ,easy),
 course('ITIS499','SENIOR PROJECT',3,hard),
 course('ITIS469','AI',3,hard)] ).

Я хочу написать правило, которое суммирует часы кредитов из списка

sum([],0).
sum(H|T,S):-
sum(T,S1),
 S is H + S1.


sumCr(Id, Cr):-
    student(Id,_,_,Courselist),
    sum(Courselist,Cr).    

Приведенное выше правило суммирует все элементы фактов в списке, но я хочу суммировать только значение Cr всех фактов в списке. Поэтому, когда я запускаю следующий запрос, вывод должен быть.

 ?. sumCr(20135639, Cr).
    Cr=12.      

person Far    schedule 27.05.2017    source источник
comment
sum ничего не суммирует; он дает 0 для пустого списка и несвязанную переменную для любого более длинного списка.   -  person Scott Hunter    schedule 27.05.2017
comment
Я исправил ошибку @ScottHunter   -  person Far    schedule 27.05.2017
comment
sum(H|T,S) имеет проблемы с синтаксисом. Кроме того, ваш sum/2 предназначен для суммирования списка целых чисел, но вы передаете ему список названий курсов (или что-то в этом роде, непонятно).   -  person lurker    schedule 27.05.2017


Ответы (1)


Вам просто нужно извлечь часть каждого course, которую вы хотите суммировать:

sum( [], 0 ).
sum( [course(_,_,N,_)|T], Sum ) :-
    sum( T, NT ),
    Sum is NT + N.
person Scott Hunter    schedule 27.05.2017
comment
Это то, что я искал. Спасибо. - person Far; 27.05.2017