3

如果 IntList 由单调递增的 > 整数和后跟单调递减的整数组成,则 hill(+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,[]).  

但这不起作用。逻辑是:一个数字列表是hillIF 它是increasing然后decreasing。我怎么说?此代码执行increasingand decreasing,但没有列表可以同时是increasingand decreasing

有任何想法吗?

4

3 回答 3

2

我不想为家庭作业问题提供一个完整的、可行的解决方案,但我会用文字描述我将如何从你现在得到的代码开始。现在你的increasingdecreasing谓词测试整个列表。但是,根据您的定义,一座小山既不是完全增加也不是完全减少。我会将这些谓词修改为有两个参数而不是一个。附加参数将绑定到不满足增加/减少标准的列表尾部。然后,我会稍微修改 hill 以使用新参数increasing来测试不是整个列表的递减,而是初始递增子序列之后的部分。最后,decreasing

如果您需要更好的提示,或者我似乎在胡说八道(很有可能,因为我对 Prolog 不太擅长),请告诉我,我会尝试澄清更多。

根据 OP 的评论进行编辑:好吧,让我们试试别的。L是山当且仅当L是至少两个以某个元素结尾的单调递增元素M的列表,后跟至少一个以某个元素开头的单调递减元素的列表N,其中N < M. 你能把那个描述翻译成 Prolog 子句吗?

编辑采取两个(SPOILER WARNING)


在您修改后的代码中,删除这三个谓词:increasing([]).hill([]).hill(List) :- decreasing(List).。这几乎会给你一个解决方案,但它仍然会失败,例如 on [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 回答