Как устранить ошибку в получении числа дней? Суть программы - посчитать количество дней в летних месяцах.
Имеется следующий код: % 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

21 Авг 2019 в 06:07
231 +3
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 Апр 2024 в 13:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир