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

Prolog 序言。从列表中删除偶数索引,prolog,visual-prolog,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). 我错过了列表中的第一项,并将第二项保存在新列表中。 但只有当列表的长度为偶数时,它

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

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).
我错过了列表中的第一项,并将第二项保存在新列表中。 但只有当列表的长度为偶数时,它才有效


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

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

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

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

谢谢。我添加了
remove([H | T1],])。
基本情况,但现在我有了
3种解决方案:NewList=[]、NewList=[2]、NewList=[2,4]
当list是
[1,2,3,4,5]
时。你说过
一个只有一个元素的列表:你完成了,结果就是那个元素,但如果那个元素单独存在,那么它就是偶数元素,我需要删除它。我是对的吗?例如,我的基本情况
remove([H | T1],])
是对的?为什么我会得到3个答案?如果计数从1开始,那么我使用
remove([H | T1],[H])
基本情况said@HelterShelter不,这不是我说的。你写的不是一个只有一个元素的列表;它是一个至少有一个元素和尾部的列表。你知道,
H
T
代表“头”和“尾”,对吗?哦,很抱歉问了这么愚蠢的问题。我明白了<代码>删除([H],[H])。
感谢您的解释。