Как получилось, что «Мария» - это правда дважды? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть программа 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).

Что-то я не так делаю?

1 Ответ

1 голос
/ 12 апреля 2020

Ваша программа уже успешно выполняется на pass(mary), если courseworkCheck/1 ограничен одной из альтернатив. То есть,

courseworkCheck(Student):-
  (  coursework(Student, Mark),
     Mark > 49
  ;  <s>marks(Student, List)</s>,
     <s>avg(List, Avg)</s>,
     <s>Avg > 49, <b>false</b></s>
  ).

и

courseworkCheck(Student):-
  (  <s>coursework(Student, Mark)</s>,
     <s>Mark > 49, <b>false</b></s>
  ;  marks(Student, List),
     avg(List, Avg),
     Avg > 49
  ).

успешны. По сути, это не проблема как таковая. Лучше всего было бы уменьшить накладные расходы, обернув setof(t, courseworkCheck(Student), _) или setof(t,pass(Student),_). Но используйте это устройство экономно.

В противном случае, Avg >= 50 предпочтительнее, чем Avg > 49. В конце концов, однажды Avg = 49.5 может произойти ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...