Пролог IntList определение - PullRequest
3 голосов
/ 15 ноября 2009

hill (+ IntList) успешно выполняется, если IntList состоит из монотонно увеличивающихся> целых чисел, за которыми следуют монотонно убывающие целые числа. Например,> [1,2,5,8,11,6,3, -1] является холмом, но [1,2,5,8,11,6,9,3, -1] и [1 2,3,4,5,6] не являются холмами. Вы можете предположить, что IntList содержит только целые числа.

Это то, что я сделал до сих пор:

hill(List) :-
    increasing(List), decreasing(List).

increasing([H|Tail]) :-
    sm(H,Tail),
    increasing(Tail).
increasing([]).


decreasing([H|Tail]) :-
    gr(H,Tail),
    decreasing(Tail).

decreasing([]).

hill([]).

gr(X,[H|Tail]) :- X>H.
gr(X,[]).

sm(X,[H|Tail]) :- X<H.  
sm(X,[]).  

Но это не работает. Логика такова: список чисел равен hill, ЕСЛИ это increasing, а затем decreasing. Как мне это сказать? Этот код increasing и decreasing, но ни один список не может быть одновременно increasing и decreasing.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 15 ноября 2009

Я не хочу давать полное, работающее решение проблемы домашней работы, но я опишу словами, как бы я исходил из кода, который вы получили прямо сейчас. Прямо сейчас ваши предикаты increasing и decreasing проверяют весь список. По вашему определению, однако, холм не является ни полностью увеличивающимся, ни полностью уменьшающимся. Я бы изменил эти предикаты, чтобы иметь два аргумента вместо одного. Дополнительный аргумент будет связан с хвостом списка, который не удовлетворяет критериям увеличения / уменьшения. Затем я бы немного изменил Hill, чтобы использовать новый аргумент increasing для проверки уменьшения не всего списка, а части после начальной увеличивающейся подпоследовательности. Наконец, я бы использовал новый аргумент decreasing, чтобы убедиться, что после убывающей подпоследовательности нет неубывающих элементов.

Если вам нужны лучшие подсказки или если я, кажется, говорю чепуху (вполне возможно, поскольку я не очень хорош с Прологом), просто дайте мне знать, и я постараюсь уточнить больше.

Редактирование на основе комментариев ОП: Хорошо, давайте попробуем что-нибудь еще. L является холмом тогда и только тогда, когда L является списком по крайней мере из двух монотонно увеличивающихся элементов, заканчивающихся некоторым элементом M, за которым следует список по крайней мере из одного монотонно убывающего элемента, начинающегося с некоторого элемента N, где N < M. Можете ли вы перевести это описание в пункты Пролога?

Изменить дубль два (ПРЕДУПРЕЖДЕНИЕ СПОЙЛЕРА) :


В своем исправленном коде отбросьте эти три предиката: increasing([])., hill([]). и hill(List) :- decreasing(List).. Это почти даст вам решение, но все равно не удастся, например, на [3, 2, 1]. Однако исправить это должно быть довольно просто.

1 голос
/ 02 сентября 2015

Использование !

:- use_module(library(clpfd)).

Нам не нужно беспокоиться о правильной рекурсии, если мы используем append/3 и chain/2 следующим образом:

hill(Zs) :-
   Ascending0 =   [_|_],
   Descending = [M,_|_],
   append(Ascending0,Descending,Zs),
   append(Ascending0,[M],Ascending),
   chain(Ascending ,#<),
   chain(Descending,#>).

Давайте запустим запросы, которые выдал ОП!

?- hill([1,2,5,8,11,6,3,-1]).
  true                               % as expected
; false.

?- hill([1,2,5,8,11,6,9,3,-1]).
false.                               % as expected

?- hill([1,2,3,4,5,6]).
false.                               % as expected 
0 голосов
/ 15 ноября 2009
hill(L1) :- concatenate(L2,L3,L1), inc(L2), dec(L3).
dec([X|[Y|[]]]) :- X > Y.
dec([X|[Y|L]]) :- X > Y, dec([Y|L]).
inc([X|[Y|[]]]) :- Y > X.
inc([X|[Y|L]]) :- Y > X, inc([Y|L]).
concatenate([],L2,L2).
concatenate([X|L1],L2,[X|L3]) :- concatenate(L1,L2,L3).

Это работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...