我编写了反子列表的代码
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如此糟糕。请帮忙
答案 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).