序言。从列表中删除偶数索引
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 开始计算索引,你有:
- 空列表:完成,结果是空列表
- 只有一个元素的列表:完成,结果是空列表
- 具有两个或更多元素的列表:丢弃第一个,将第二个作为结果的第一个,并将谓词应用于其余部分。
我尝试删除索引为偶数的元素。 这是我的代码:
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 开始计算索引,你有:
- 空列表:完成,结果是空列表
- 只有一个元素的列表:完成,结果是空列表
- 具有两个或更多元素的列表:丢弃第一个,将第二个作为结果的第一个,并将谓词应用于其余部分。