我有功能:
onlySecond([],[]).
onlySecond([H1,H2|T1],[H2|T2]) :- onlySecond(T1,T2).
它返回列表中的每个第二个元素。
但我很好奇为什么它没有返回任何东西(在我看来,它必须返回[] - 空列表)当第一个参数是带有1个元素的列表时。例如:
onlySecond([1],X). - not return anything.. but why it doesn't return []??
答案 0 :(得分:2)
您的程序有一个更大的问题:它会为任何奇数大小的列表返回false
。原因是没有onlySecond/2
的条款可以与具有恰好一个项目的列表统一 - 当您开始使用具有奇数项目的列表时,您必须达到的条件,因为每次递归调用都会将原始列表的长度减少两个:
[1]
不是一个空列表[1]
的项目少于两个。为了解决此问题,请添加一个单独的子句来处理只包含一个项目的列表:
onlySecond([_], []).
添加此子句使您的代码也适用于奇数长度的列表。