Я борюсь с вопросом в задании с прологом.
Итак, у меня в прологе есть следующая база фактов:
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 против составного предиката, но могу ошибаться (я все еще нахожусь на ранних этапах изучения пролога).
У вас есть идея? Я смотрю на эту проблему со всех сторон и застрял здесь.
Спасибо.