2013-05-30 5 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 или больше, чем длина списка написать сообщение («Error»). Поэтому он должен выглядеть так:

?-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' - или это нормально? Edit: 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 обычно встроен в большинство пролог-сред.

+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. 
Смежные вопросы