0

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

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

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

4

1 回答 1

2

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

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

  • 一个空列表:你完成了,结果是空列表
  • 一个只有一个元素的列表:你完成了,结果是空列表
  • 具有两个或多个元素的列表:丢弃第一个,将第二个作为结果的第一个,并将谓词应用于其余元素。
于 2015-03-23T17:52:14.050 回答