从列表中删除中间元素

22

我想编写一个Prolog程序,将奇数长度列表的中间元素删除到另一个列表中。

例如,如果我们给出: delete_mid([1,2,3,4,5],L),那么它将产生答案:L = [1,2,4,5]


3
承诺:将为最佳终止ISO Prolog定义(即,无协同处理)提供赏金,该定义至少在OP的用例中普遍终止,并且还适用于“?- delete_middle(Ls,[])。 ”和“?- dif(A,B),delete_middle([A | _],[B | _])。” - false
11个回答

0

这是我的Prolog解决方案:

delMidNumber(K,L):-
     len(K,N),
     (N mod 2 =:= 1 ->  
      N1 is N//2,
      nth0(N1,K,E1),
      del(E1,K,L); write('List has even length'),!).

len([],0).
len([H|T],N):-
    len(T,N1),
    N is N1+1.

del(E,[E|T],T).
del(E,[H|T],[H|T1]):-
    del(E,T,T1).

谓词delMidNumber接受两个参数:1-奇数列表。2-将被形成的新列表。该谓词首先计算列表的长度,然后检查列表的长度是否为奇数,然后将长度除以2。结果用于nth0,以得到该索引上的元素。然后我们只需使用del谓词删除那个中间数字元素。如果长度为偶数,则写入长度为偶数的消息,然后截断(停止)。

?-delMidNumber([1,3,2,4,5],L).
L = [1, 3, 4, 5]

?-delMidNumber([1,3,4,5],L).
List has even length

我喜欢你在努力学习Prolog。你能否添加另一个测试案例呢?试试delMidNumber([2,3,2,4,5],L),你可能会发现需要改进的地方。 - DuDa
@Raubsauger 是的,我试过了。它返回的是L=[3,2,4,5],而最终期望的答案是L=[2,3,4,5]。 - Reema Q Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接