1

我有功能:

onlySecond([],[]).

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

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

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

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

1 回答 1

2

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

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

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

onlySecond([_], []).

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

演示。

于 2015-12-21T20:01:28.693 回答