【问题标题】:How does this compute ? I am trying to understand how the values of H get assigned in the list这是如何计算的?我试图了解 H 的值是如何在列表中分配的
【发布时间】:2012-04-03 02:18:36
【问题描述】:

此谓词应打印大小为N 的列表,其中包含01 的可能排列。

我的问题是:H 的值是否会随着每次递归而被延续,或者是否在回溯阶段创建具有bit(H) 值的列表?

bit(0).
bit(1).
gen(0,[]).
gen(N,[H|T]) :-
   N > 0,
   bit(H),
   N1 is N - 1,
   gen(N1,T).

【问题讨论】:

    标签: recursion prolog backtracking


    【解决方案1】:

    Prolog 的执行完全取决于选择点。这里bit/1 谓词在每个递归步骤中留下一个选择点。 当你要求 Prolog 给你另一个解决方案时,它只会回到最年轻的选择点。这里,不是通过bit/1的第一个子句并将H绑定到0,而是通过第二个子句将H绑定到1。一旦两个子句都被选中,Prolog 将返回到旧的选择点,等等……直到最终所有的选择点都用完并且程序返回 false.

    您可以使用trace/0 谓词自己尝试:

    ?- trace, gen(3, Result).
    

    【讨论】:

      【解决方案2】:

      我可以先给你一个更直接的定义:

      gen(N, Xs) :-
         length(Xs, N),
         maplist(between(0,1), Xs).
      

      在这个定义中,所有递归部分现在都隐藏在一些内置函数中。第一个目标确保Xs 是长度为N 的列表。并且下一个目标确保每个元素都在 0 和 1 之间。如果您查看答案,您将意识到解决方案的枚举顺序:

      ?- gen(4, Xs)。 Xs = [0,0,0,0] ; Xs = [0,0,0,1] ; Xs = [0,0,1,0] ; Xs = [0,0,1,1] ; Xs = [0,1,0,0] ; Xs = [0,1,0,1] ; Xs = [0,1,1,0] ; ...

      【讨论】:

        【解决方案3】:

        这个谓词生成二进制系统中的所有数字(有顺序)要理解它你必须理解prolog回溯,你可以画一些替换树来理解它

        【讨论】:

          猜你喜欢
          • 2015-07-09
          • 2022-10-07
          • 1970-01-01
          • 2021-07-03
          • 1970-01-01
          • 2012-08-13
          • 1970-01-01
          • 1970-01-01
          • 2020-08-31
          相关资源
          最近更新 更多