Рекурсивное суммирование с условным в прологе - PullRequest
0 голосов
/ 12 апреля 2020

Меня попросили создать программу на Прологе, которая должна суммировать парные и нечетные числа с рекурсивной структурой. Правило имеет следующую форму:

sum(N,PairSum,OddSum)

С N в качестве числа, указанного в качестве параметра. Например: если N = 5, то PairSum = 4 + 2 и OddSum = 5 + 3 + 1

Мой код следующий

suma(0,0,0).
suma(N,SumPares,SumImpares) :-
   N>0,
   N1 is N -1,
   suma(N1,SumaP,SumaI),
   (  (0 is mod(N,2))
   -> SumPares is SumaP + (N-2)
   ;  SumImpares is SumaI +(N-2)
   ).

Код успешно компилируется, он завершается неудачно, когда я запустить его. Например, с N = 5

suma (5, SumaPares, SumaImpares)

Я получаю следующее

ОШИБКА: Аргументы не являются достаточно экземпляров ОШИБКА: В: ОШИБКА:
[12] _9750 является _9756 + (2-2)

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

После следования советам @gusbro и включения некоторых других я мог заставить этот код работать должным образом. Ключ был в базовом случае, который был сума (2,2,1), а не сума (0,0,0). Другой проблемой, с которой я столкнулся, были мои суммирования в предложении if, если я делаю N-2, и мне просто нужно оставить N в покое и ничего не вычитать. Вот рабочий код:

 suma(2,2,1).
 suma(N,SumaPares,SumaImpares) :-
       N>0,
       N1 is N -1,
       suma(N1,SumaP,SumaI),
       ( 0 is mod(N,2) ->
            (SumaPares is SumaP + N, SumaImpares is SumaI)
         ;  (SumaImpares is SumaI +N, SumaPares is SumaP)
       ).

Большое спасибо за помощь.

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

При обращении к этому коду вы должны увидеть 2 одиночных предупреждения: SumaI и SumI появляются только один раз в теле второго пункта процедуры summation/3.

Глядя на ваш код, кажется, что вы хотел использовать ту же переменную, поэтому переименуйте SumaI в SumI. Теперь вы не должны видеть одноэлементных предупреждений после повторного анализа кода.


[редактировать после уточнения]

После редактирования у вас все еще остаются одноэлементные предупреждения. Помимо опечаток, проблема заключается в том, что ваша условная ветвь назначает одну из переменных суммы, а другую оставляет как есть. Я считаю, что вы хотите что-то вроде этого:

suma(0,0,0).
suma(N,SumaPares,SumaImpares) :-
   N>0,
   N1 is N -1,
   suma(N1,SumaP,SumaI),
   ( 0 is mod(N,2) -> 
        (SumaPares is SumaP + (N-2), SumaImpares=SumaI)
     ;  (SumaImpares is SumaI +(N-2), SumaPares=SumaP)
   ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...