List 序言列表拆分

List 序言列表拆分,list,prolog,visual-prolog,List,Prolog,Visual Prolog,我有以下职能: onlySecond([],[]). onlySecond([H1,H2|T1],[H2|T2]) :- onlySecond(T1,T2). 它返回列表中的每一个元素 但我很好奇,当第一个参数是包含1个元素的列表时,为什么它不返回任何内容(在我看来,它必须返回[]-空列表)。例如: onlySecond([1],X). - not return anything.. but why it doesn't return []?? 您的程序有一个更大的问题:对于任何奇数大小的

我有以下职能:

onlySecond([],[]).

onlySecond([H1,H2|T1],[H2|T2]) :- onlySecond(T1,T2).
它返回列表中的每一个元素

但我很好奇,当第一个参数是包含1个元素的列表时,为什么它不返回任何内容(在我看来,它必须返回[]-空列表)。例如:

onlySecond([1],X). - not return anything.. but why it doesn't return []??

您的程序有一个更大的问题:对于任何奇数大小的列表,它都返回
false
。其原因是,
onlySecond/2
中没有一个子句可以与一个只有一个项的列表相统一——当您从一个具有奇数个项的列表开始时,您必须达到这个条件,因为每次递归调用都会将原始列表的长度减少两倍:

  • 它与第一个子句不统一,因为
    [1]
    不是空列表
  • 它与第二个子句不统一,因为
    [1]
    的项少于两项
为了解决此问题,请添加一个单独的子句来处理正好有一个项的列表:

onlySecond([_], []).
添加此子句可以使代码也适用于奇数长度的列表