Как устранить ошибку в получении числа дней? Суть программы - посчитать количество дней в летних месяцах.
Имеется следующий код: % Copyright
implement main
open core, console, math, string
class facts
месяц : (string Имя_Месяца, unsigned Номер_по_порядку, unsigned Количество_дней).
class predicates
sumli : (unsigned C,unsigned Sum [out]) .
clauses
месяц("Январь", 1, 31).
месяц("Февраль", 2, 28).
месяц("Март", 3, 31).
месяц("Апрель", 4, 30).
месяц("Май", 5, 31).
месяц("Июнь", 6, 30).
месяц("Июль", 7, 31).
месяц("Август", 8, 31).
месяц("Сентябрь", 9, 30).
месяц("Октябрь", 10, 31).
месяц("Ноябрь", 11, 30).
месяц("Декабрь", 12, 31).
sumli(N,0):- N>8,!.
sumli(N,C):- месяц(_, N, Count),sumli(N+1,Count1),C=Count1+Count.
run() :-
setConsoleTitle("задача 8"),
sumli(6,Sum),
/* Sum = 0,
месяц(_, N, Count),
N >= 6,
N <= 8,
fail()
or
write("ответ: ", Sum),*/
write(Sum),
nl,
write("для закрытия нажмите любую клавишу"),
clearInput(),
_ = readChar().
% place your own code here
end implement main
goal
console::run(main::run).
Но, выдает ошибку
e631 The predicate 'main::sumli/2 (i,o)', which is declared as 'procedure', is actually 'nondeterm' main.pro

21 Авг 2019 в 06:07
209 +1
0
Ответы
1

Ошибка заключается в том, что предикат sumli объявлен с аргументами N и C как входными, в то время как в определении он используется рекурсивно как N+1 и Count1. Это означает, что на самом деле предикат sumli является недетерминированным (вызывается несколько раз для разных входных значений N), а не процедурным (вызывается только один раз с определенными аргументами). Чтобы устранить эту ошибку, измените декларацию предиката sumli следующим образом:

sumli : (unsigned N, unsigned Sum [out]) .

Затем корректируйте определение предиката sumli, чтобы оно соответствовало новой декларации:

sumli(N,0):- N>8,!.
sumli(N,C):- месяц(_, N, Count),NextN = N+1,sumli(NextN,Count1),C=Count1+Count.

Эти изменения должны устранить ошибку и позволить правильно вычислять количество дней в летних месяцах.

20 Апр в 13:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 436 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир