反向子列表

时间:2011-05-23 04:02:32

标签: prolog

我编写了反子列表的代码

minv([],_,_,[]).
minv(L,N,K,Result):-
   slist(0,N-1,L,Re1),
   append(Re1,[],Result1),
   slist(N-1,K-N+1,L,Re),
   reverse(Re,Res),
   append(Result1,Res,Result2),
   length(L,D),
   slist(K,D-K,L,Resu),
   append(Result2,Resu,Result).


slist(0,0,_,[]):-!.
slist(0,Length,[E|List],[E|Sublist]):-
   Length1 is Length-1,!,
   slist(0,Length1,List,Sublist).
slist(Offset,Length,[_|List],Sublist):-
   Offset1 is Offset-1,!,
   slist(Offset1,Length,List,Sublist).

但老师伤心的不是prolog风格,因为minv如此糟糕。请帮忙

4 个答案:

答案 0 :(得分:2)

我花了一些时间才明白minv意味着我的反面。 您只需从输入列表中获取元素并将它们附加到结果列表的末尾。

inverse([], []).
inverse([H|T], Result):-
    inverse(T, TInv), append(TInv, [H], Result).

答案 1 :(得分:1)

乔治的回答中提到的并不简单。 minv(List,Begin,End,Result)从Begin到End获取子列表,并仅反转该部分。

| ? - minv([1,2,3,4,5,6,7,8,9],2,3,X)。

X = [1,3,2,4,5,6,7,8,9]?

答案 2 :(得分:0)

让我试试:(我没有在prolog上测试它)

inverse(L, 1, 1, L).

inverse([H|L], 1, K, [H|R]):-
    inverse(L, 1, K-1, LInv), append(LInv, [H], R).

inverse([H|L], N, K, [H|R]):-
    inverse(L, N-1, K, R).

答案 3 :(得分:0)


inverse(L,Begin,End,Result) :-
        length(L1,End),
        Begin_1 is Begin - 1,
        length(L0,Begin_1),
        append(L0,L2,L1),
        append(L1,L3,L),
        reverse(L2,RL2),
        append(L0,RL2,L3,Result).