Пролог-код выводит False вместо значения переменной - PullRequest
1 голос
/ 21 марта 2019

Предикат, который будет возвращать сумму четных чисел в списке:

sumsq_even([], 0).
sumsq_even([FirstNum|RestOfNums], Total) :-
    sumsq_even(RestOfNums, TotalRest),
    Total is FirstNum + TotalRest :- 0 is FirstNum mod 2,  % Add Firstnum if it is even
    Total is TotalRest :- 1 is FirstNum mod 2.             % Dont add if firstnum is odd

Сначала мой код компилируется, но я получаю синтаксическую ошибку: конфликт приоритетов операторов в строке 4. Также при попыткезапрос:

sumsq_even([1,3,5,2,-4,6,8,-7], Total).

возвращает значение False, а не значение Total.Что я делаю не так?

1 Ответ

2 голосов
/ 21 марта 2019

Использование :- в вашем коде (строки 4 и 5) неверно.В Прологе if A then B else C записывается как ( A -> B ; C).Итак, ваш код должен быть:

sum_even([],S,S).
sum_even([H|T],ST,S):-
    (   0 =:= H mod 2 ->  
        SO is ST+H;
        SO = ST
    ),
    sum_even(T,SO,S).

sumsq_even(L,Total):-
    sum_even(L,0,Total).

?- sumsq_even([1,3,5,2,-4,6,8,-7], Total).
Total = 12.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...