序言。从列表中删除偶数索引

时间:2015-03-23 17:12:44

标签: prolog visual-prolog

我尝试删除带有偶数索引的元素。 这是我的代码:

DOMAINS
    list = integer*
PREDICATES
    remove(list,list)
CLAUSES 
    remove([],[]).

    remove([_,H|T1], [H|T2]):-
        remove(T1, T2).

GOAL
    remove([1,2,3,4,5], NewList).

我错过了列表中的第一项,并将第二项保存在新列表NewList中。 但只有当列表的长度为偶数时才能正常工作。

我错过了什么?也许我的方法错了?

1 个答案:

答案 0 :(得分:2)

是的,您的谓词仅适用于包含偶数元素的列表。 remove/2的第一个子句用于空列表(无元素),第二个子句用于包含两个或更多元素的列表。然后你传递剩下的,没有前面的两个元素。

对于具有奇数个元素的列表,您需要一个只包含一个元素的列表的基本情况。逻辑是,如果你开始计算索引为0,你有:

  • 一个emtpy列表:你完成了,结果是空列表
  • 只包含一个元素的列表:完成后,结果为空列表
  • 包含两个或多个元素的列表:丢弃第一个元素,将第二个作为第一个结果,然后将谓词应用于其余元素。