2013-05-30 92 views
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或大於列表長度,寫入消息(「錯誤」)。所以它應該看起來像

?-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" 

我不知道該怎麼做。請幫忙!

+0

假設你也想產生「錯誤」,如果「A> B」 - 或者沒問題?編輯:NM,我看你在第一條規則中處理了。 – Orbling

+0

您是否希望它爲L返回'錯誤',還是單獨輸出? – Orbling

+0

@Orbling我認爲L,但是有什麼區別嗎? – Tanya

回答

1

你只需要添加一對夫婦的規則,即檢查該A <= B規則後:

delm(A, _, _, 'Error') :- A < 1, !. 
delm(_, B, C, 'Error') :- length(C, L), B > L, !. 

所以整個代碼是(只用你的代碼):

del1(1,[_|T],T):-!. 
del1(N,[X|T],[X|L]):-N1 is N - 1,del1(N1,T,L). 

delm(A,B,C,D):-A>B,delm(B,A,C,D). 
delm(A,_,_,'Error'):-A<1,!. 
delm(_,B,C,'Error'):-length(C, L), B>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). 

一般我會打電話給這樣一個例程slice。順便提一句,length/2通常內置於大多數prolog環境。

+1

謝謝,親愛的!祝福你! – Tanya

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. 
相關問題