Прежде всего, вы должны понимать, что в Прологе вы не манипулируете возвращаемыми значениями функции. Причина этого в том, что вы манипулируете не функциями, а предикатами. Таким образом, length (List) никогда не вычисляется как число, а как true или false, как любой другой предикат. Когда вы пишете findelement(List, length(List), len...
, предикат findelement не будет вызываться с чем-то вроде [a, b, c]
и 3
, он будет вызываться с чем-то вроде [a, b, c]
и length([a, b, c])
. Так что ваша программа уже не может работать.
Если оставить в стороне, ваша программа все еще очень неправильная. Основной способ рекурсии работает на прологе или на функциональных языках (а также при использовании структурной индукции в математике) следующим образом:
пункт для инициализации
пункт о наследственности
В вашей программе нет условия инициализации. Это означает, что когда рекурсия достигает []
, никакое предложение не может с этим справиться, и это не помогает Остальное тоже неверно, но я думаю, что особенно важно сначала правильно сформулировать принципы рекурсии.
Чтобы проиллюстрировать это, не портя проблему для вас (в конце концов, это домашняя работа), я приведу пример: скажем, вы хотите проверить, безопасна ли овчарка. Овчарня безопасна, если в ней нет волка. Если мы представим овчарню списком, а волка - атомом wolf
, мы можем написать предикат так:
Инициализация: если овчарня пуста, она в безопасности, там нет волка.
safe_sheepfold([]).
Наследственность: если овчарня безопасна с n-1 членами, то безопасно с n членами, если добавленный член не является волком:
safe_sheepfold([Animal|Sheepfold]) :-
Animal =\= wolf,
safe_sheepfold(Sheepfold).
И это все. Чтобы увидеть, как пролог обрабатывает запрос, скомпилируйте его и выполните трассировку. Команда перед запуском предиката, как указано в вашем последнем вопросе, поможет вам понять, как все работает.
Чтобы вы подумали об этом на более конкретном примере, вот классический предикат факториал (он также использует арифметику):
Вот наш пункт инициализации:
factorial(0, 1).
Вот наш пункт о наследственности:
factorial(N, F) :-
N > 0,
NextN is N - 1,
factorial(NextN, NextF),
F is NextF * N.
Для простоты я не делал этот хвост предиката рекурсивным и не использовал сокращения, вы узнаете об этом позже!
Надеюсь, мой бродяга поможет мне.
редактировать пост обновления:
Это почти так! Теперь просто еще несколько подсказок: желаемый результат - это не список, это просто элемент, поэтому попробуйте изменить последнее предложение, чтобы он просто возвращал элемент, а не список с элементом. И предложение инициализации на самом деле является вашим последним предложением здесь (то, что проверяет, если вы выше 3), так что вам не нужно это с []
! Ты почти у цели:)