3

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それ以降です。どう言うの?このコードはとを行いますが、リストをとの両方にすることはできません。increasingdecreasingincreasingdecreasingincreasingdecreasing

何か案は?

4

3 に答える 3

2

宿題の問題に対して完全で実用的な解決策を提供したくはありませんが、現在入手しているコードからどのように進めるかを言葉で説明します。現在、あなたincreasingdecreasing述語はリスト全体をテストしています。しかし、あなたの定義によれば、丘は完全に増加しているわけでも、完全に減少しているわけでもありません。これらの述語を変更して、1つではなく2つの引数を持つようにします。追加の引数は、増加/減少の基準を満たさないリストの末尾にバインドされます。次に、丘を少し変更して、の新しい引数を使用してincreasing、リスト全体ではなく、最初の増加部分列の後の部分の減少をテストします。ついに、decreasing

より良いヒントが必要な場合、または私がナンセンスな話をしているように思われる場合(私はPrologがあまり得意ではないので、かなり可能です)、私に知らせてください。もっと明確にしようと思います。

OPのコメントに基づいて編集します。わかりました。別のことを試してみましょう。は、ある要素で終わる少なくとも2つの単調増加要素のリストと、それに続くいくつかの要素で始まる少なくとも1つの単調減少要素のリストであるL場合に限り、丘です。ここで、。その説明をProlog句に翻訳できますか?LMNN < M

テイク2を編集(スポイラー警告)


改訂されたコードで、次の3つの述語を削除します:increasing([]).、、、hill([]).およびhill(List) :- decreasing(List).。これはほとんど解決策を提供しますが、それでも失敗し[3, 2, 1]ます。ただし、これを修正するのはかなり簡単です。

于 2009-11-15T05:04:20.397 に答える
1

を使用してください!

:- 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,#>).

OPが提供したクエリを実行してみましょう!

?- 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 
于 2015-09-02T10:36:43.517 に答える
0
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).

これは動作します:)

于 2009-11-15T05:00:11.880 に答える