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([_], []).
添加此子句使您的代码也适用于奇数长度的列表。
我有功能:
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([_], []).
添加此子句使您的代码也适用于奇数长度的列表。