Prolog列出拆分

时间:2015-12-21 19:57:47

标签: 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 []??

1 个答案:

答案 0 :(得分:2)

您的程序有一个更大的问题:它会为任何奇数大小的列表返回false。原因是没有onlySecond/2的条款可以与具有恰好一个项目的列表统一 - 当您开始使用具有奇数项目的列表时,您必须达到的条件,因为每次递归调用都会将原始列表的长度减少两个:

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

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

onlySecond([_], []).

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

Demo.