Я пытаюсь сделать небольшой проект в прологе, где пользователь может ввести список, а затем он вычисляет среднее, максимальное в списке и т.д. и т.п.Пролог проблема с максимальной функцией списка: nondeterm против процедуры
Так так хорошо, но я столкнулся с проблемой при написании функции max (находит максимальное число в списке). Код:
maxN([X],X):-!.
maxN([X|L],X) :- maxN(L,M), X > M.
maxN([X|L],M) :- maxN(L,M), M >= X.
сама функция работает отдельно, но я получаю сообщение об ошибке:
предиката «прогнозного :: (я, о) maxN/2», который объявлен как «процедура », на самом деле 'nondeterm' forma.pro
Это мой предикат в * определение .cl:
maxN
: (целое число * Z, число U) процедура (я, о).Я не могу объявить его незаменимым, поскольку он вызывает проблемы со всей моей формой. Можете ли вы мне помочь/дать подсказку, как сделать процедуру? Я думаю, что мне нужно сделать разрез где-то, но мои попытки потерпели неудачу.
P.S. Я использую Visual Prolog 7.4.
Редактировать: После того, как вы попробовали альтернативы, предлагаемые для того, чтобы сделать два правила в одном или с аккумулятором, теперь я получаю, что предикат является «детермином» вместо процедуры. Согласно моему руководству Prolog, это означает, что предикат теперь не имеет нескольких решений, но вместо этого имеет шанс выйти из строя. В основном все варианты кода, которые я сделал до сих пор, приводят меня к «детекту».
Вы должны включить диалект в этом вопросе. –
Спасибо за помощь, ребята, я исправил «детекцию», добавив: maxN ([], Max): - Max = 0,!. Теперь я знаю, что это технически не очень правильно делать, но поскольку моя программа проверяет пустой список (в основном, maxN ([], Max) никогда не будет вызвана и существует только для полноты правил, он работает для меня. Спасибо вам за советы, они поставили меня в правильном направлении! –
Он все равно может потерпеть неудачу, если вы передадите что-то помимо списка в первом аргументе. Если вы все еще хотите «исправить» это (я бы не хотел, t) вы можете предоставить другое правило формы 'maxN (X, undefined): - \ + is_list (X) .' –