【发布时间】:2013-05-30 20:18:56
【问题描述】:
我需要从列表中的一个元素索引删除到另一个。所以它应该是这样的:
?-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"
我不知道该怎么做。请帮忙!
【问题讨论】:
-
如果
A > B大概你也想产生“错误” - 或者可以吗?编辑:NM,我看到你在第一条规则中处理了。 -
你希望它为L返回'Error',还是单独输出?
-
@Orbling 我认为是 L,但有什么不同吗?
-
你调用它的方式有问题,就好像你只是输出'Error'并仍然调用
write(L),而L是未绑定的,你会得到一个讨厌的_ABC未绑定术语写. -
@Orbling 好的,我认为只输出“错误”,没有讨厌的 _ABC