У меня есть программа Prolog, которая должна возвращать true для pass(mary)
один раз, за исключением моего возвращения дважды, и я не уверен, почему.
Программа предназначена для проверки, прошел ли Student
их курс. Он проверяет:
- , имеет ли
Student
достаточно высокий Mark
в своем курсе программирования, - , что они не сдали экзамен,
- чтобы увидеть, если их средняя успеваемость на экзаменах выше 40,
- , если их курсовая работа выше 50; если это не так, то их средняя успеваемость на экзаменах должна быть 50 или выше, чтобы сдать.
С фактами, которые у меня есть, «Мэри» сдает (как она должна), в то время как другие терпят неудачу (как и следовало бы), но «Мэри» почему-то дважды верна.
Факты (просто «Мэри»):
coursework(mary, 75).
programming(mary, 70).
e1(mary, 60).
e2(mary, 65).
e3(mary, 70).
marks(mary, [60, 65, 70]).
Код:
sum([], 0).
sum([X|Tail], Sum):-
sum(Tail, Temp),
Sum = Temp + X.
avg(List, Avg):-
sum(List, Sum),
length(List, Length),
Length > 0,
Avg is Sum / Length.
examFail(Student):-
( e1(Student, MarkE1),
MarkE1 < 30
; e2(Student, MarkE2),
MarkE2 < 30
; e3(Student, MarkE3),
MarkE3 < 30
).
courseworkCheck(Student):-
( coursework(Student, Mark),
Mark > 49
; marks(Student, List),
avg(List, Avg),
Avg > 49
).
pass(Student):-
programming(Student, Mark),
Mark > 29,
\+ examFail(Student),
marks(Student, List),
avg(List, Avg),
Avg > 39,
courseworkCheck(Student).
Что-то я не так делаю?