Prolog递归细分

时间:2014-04-05 00:09:43

标签: recursion prolog

嗨,有人可以分解这个递归代码,这样我就可以完全理解它给出的输出。我真的很困惑它的工作方式:

    listcomb([],[]).
    listcomb([X|Y], [X|Z]) :-
        listcomb(Y,Z).
    listcomb([_|Y],Z) :-
        listcomb(Y,Z).



    ?- listcomb([1,2,3], X).
    X = [1, 2, 3] ;
    X = [1, 2] ;
    X = [1, 3] ;
    X = [1] ;
    X = [2, 3] ;
    X = [2] ;
    X = [3] ;
    X = [].

三江源

1 个答案:

答案 0 :(得分:1)

它通过以下方式将第二个参数与第一个参数中所有可能的元素组合统一起来:

  1. 如果列表为空,则表示已完成(第一个子句)。
  2. 一种可能的组合是将列表的头部与列表尾部的所有可能组合(第二子句)相结合。
  3. 另一种可能的组合是丢弃列表的头部,只返回列表尾部的所有可能组合(第三个子句)。
  4. 运行时,谓词将耗尽第二个子句,而不是回溯到第三个子句,依此类推,直到耗尽所有选项并停止使用第一个子句。