Prolog 列表拆分

Prolog lists splitting

我有功能:

onlySecond([],[]).

onlySecond([H1,H2|T1],[H2|T2]) :- onlySecond(T1,T2).

它 return 列表中的每个第二个元素。

但我很好奇,当第一个参数是包含 1 个元素的列表时,为什么它没有 return 什么都没有(在我看来,它必须 return [] - 空列表)。示例:

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

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

  • 它不与第一个子句统一,因为[1]不是一个空列表
  • 它不与第二个子句统一,因为[1]少于两项。

为了解决这个问题,添加一个单独的子句来处理只有一个项目的列表:

onlySecond([_], []).

添加此子句使您的代码也适用于奇数长度的列表。

Demo.