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

Prolog. Delete even indexes from list

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

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。 但它只有在列表长度为偶数时才有效。

我错过了什么?也许我的做法不对?

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

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

  • 空列表:完成,结果是空列表
  • 只有一个元素的列表:完成,结果是空列表
  • 具有两个或更多元素的列表:丢弃第一个,将第二个作为结果的第一个,并将谓词应用于其余部分。