2

リスト内のある要素インデックスから別の要素インデックスを削除する必要があります。したがって、次のようになります。

?-delm(2,4,[5,6,-3,6,11,56,81],L),write(L),nl.
L = [5,11,56,81]

だから私はこれをしました。

delm(A,B,C,D):-A>B,delm(B,A,C,D).
del1(1,[_|T],T):-!.
del1(N,[X|T],[X|L]):-N1 is N - 1,del1(N1,T,L).
delm(N,2,L,R):-del1(N,L,R),!.
delm(N,M,L,R):-M1 is M - 1,del1(N,L,Buf),delm(N,M1,Buf,R).
length([],0).
length([_|T],N):- length(T,N1),N is N1+1.
?-delm(2,4,[5,6,-3,6,11,56,81],L),write(L),nl.

ただし、数字の 1 つが 1 未満であるか、リストの長さを超えている場合は、メッセージ (「エラー」) を書き込むことも追加する必要があります。だからそれは次のように見えるはずです

?-delm(-2,4,[5,6,-3,6,11,56,81],L),write(L),nl.
"Error"
?-delm(2,-4,[5,6,-3,6,11,56,81],L),write(L),nl.
"Error"
?-delm(2,40,[5,6,-3,6,11,56,81],L),write(L),nl.
"Error"

やり方がわかりません。助けてください!

4

2 に答える 2

1

必要なものの「コア」部分は、次のように実装できます。

:- use_module(library(clpfd)).

list_from_to_skipped(Xs,From,To,Ys) :-
   From   #=  From0 + 1,
   From   #=< To,
   N_Skip #=  To - From0,
   append(Prefix,Xs0,Xs),
   append(Skip,Suffix,Xs0),
   length(Prefix,From0),
   length(Skip,N_Skip),
   append(Prefix,Suffix,Ys).

サンプルクエリは次のとおりです。

?- list_from_to_skipped([5,6,-3,6,11,56,81],2,4,Ls).
Ls = [5,11,56,81].

次に、より一般的なクエリを考えてみましょう。

?- list_from_to_skipped([a,b,c,d],From,To,Xs).
From = To, To = 1, Xs = [  b,c,d] ;
From = 1,  To = 2, Xs = [    c,d] ;
From = 1,  To = 3, Xs = [      d] ;
From = 1,  To = 4, Xs = [       ] ;
From = To, To = 2, Xs = [a,  c,d] ;
From = 2,  To = 3, Xs = [a,    d] ;
From = 2,  To = 4, Xs = [a      ] ;
From = To, To = 3, Xs = [a,b,  d] ;
From = 3,  To = 4, Xs = [a,b    ] ;
From = To, To = 4, Xs = [a,b,c  ] ;
false.
于 2015-04-30T17:32:16.837 に答える