Я не хочу давать полное, работающее решение проблемы домашней работы, но я опишу словами, как бы я исходил из кода, который вы получили прямо сейчас. Прямо сейчас ваши предикаты increasing
и decreasing
проверяют весь список. По вашему определению, однако, холм не является ни полностью увеличивающимся, ни полностью уменьшающимся. Я бы изменил эти предикаты, чтобы иметь два аргумента вместо одного. Дополнительный аргумент будет связан с хвостом списка, который не удовлетворяет критериям увеличения / уменьшения. Затем я бы немного изменил Hill, чтобы использовать новый аргумент increasing
для проверки уменьшения не всего списка, а части после начальной увеличивающейся подпоследовательности. Наконец, я бы использовал новый аргумент decreasing
, чтобы убедиться, что после убывающей подпоследовательности нет неубывающих элементов.
Если вам нужны лучшие подсказки или если я, кажется, говорю чепуху (вполне возможно, поскольку я не очень хорош с Прологом), просто дайте мне знать, и я постараюсь уточнить больше.
Редактирование на основе комментариев ОП: Хорошо, давайте попробуем что-нибудь еще. L
является холмом тогда и только тогда, когда L
является списком по крайней мере из двух монотонно увеличивающихся элементов, заканчивающихся некоторым элементом M
, за которым следует список по крайней мере из одного монотонно убывающего элемента, начинающегося с некоторого элемента N
, где N < M
. Можете ли вы перевести это описание в пункты Пролога?
Изменить дубль два (ПРЕДУПРЕЖДЕНИЕ СПОЙЛЕРА) :
В своем исправленном коде отбросьте эти три предиката: increasing([]).
, hill([]).
и hill(List) :- decreasing(List).
. Это почти даст вам решение, но все равно не удастся, например, на [3, 2, 1]
. Однако исправить это должно быть довольно просто.