setof с составным предикатом

Я борюсь с вопросом в задании с прологом.

Итак, у меня в прологе есть следующая база фактов:

student(name(doe, [john]), 33332, ['CSI1120'] ).
student(name(doe, [jane]), 33336, ['CSI1120'] ).

evaluation('CSI1120', homework(1), ['Prolog', database ], 5).

mark('CSI1120', 33332, homework(1), 3.5 ).
mark('CSI1120', 33336, homework(1), 4.0 ).

Моя цель - создать предикат listAllMarks/3, например

?- returnAllMarks('CSI1120',homework(1),L).

Возврат:

L= [(33332, 3.5), (33336, 4.0)].

Чтобы решить эту проблему, я подумывал использовать пролог setof/3, поэтому пришел со следующим предикатом.

returnAllMarks(C,H,L):- setof(L,mark(C,_,H,X),[L|X]).

Кажется, это не работает, предикат всегда возвращает false. Я подозреваю, что это может быть связано с тем, что я использую setof против составного предиката, но могу ошибаться (я все еще нахожусь на ранних этапах изучения пролога).

У вас есть идея? Я смотрю на эту проблему со всех сторон и застрял здесь.

Спасибо.


person PapaEcho    schedule 12.03.2017    source источник


Ответы (1)


Вы могли бы написать что-то вроде:

returnAllMarks(C,H,L):- setof( (X,Y), mark(C,X,H,Y), L).

Пример:

?- returnAllMarks('CSI1120',homework(1),L).
L = [ (33332, 3.5), (33336, 4.0)].
person coder    schedule 12.03.2017