【问题标题】:Prolog lists splittingProlog 列表拆分
【发布时间】:2015-12-21 19:57:46
【问题描述】:

我有功能:

onlySecond([],[]).

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

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

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

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

【问题讨论】:

    标签: list prolog visual-prolog


    【解决方案1】:

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

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

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

    onlySecond([_], []).
    

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

    Demo.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多