有人可以帮忙解释一下此复制功能吗?

jellybean_232
copyList([], []).           % base case
copyList([H|T], [H|R]) :- 
    copyList(T, R).

我“有点”了解递归的工作原理,但是当我分析此功能时,我真的很困惑。有人可以使用下面的示例逐步说明此功能会发生什么以及如何到达终点:

?- copyList([1,2,3],L).
m09

要了解会发生什么,您必须将Prolog视为一个定理求解器:在向Prolog提供查询时?- copyList([1, 2, 3], L).,您实际上是在要求Prolog证明其copyList([1, 2, 3], L)正确。

因此,Prolog将尝试证明这一点。它有两个子句可供使用:

  1. copyList([], []).
    
  2. copyList([H|T], [H|R]):- 
    copyList(T, R).
    

因为它是第一个遇到的问题,所以Prolog会尝试copyList([1, 2, 3], L)通过使用子句证明这是正确的copyList([], [])

为此,由于该子句没有主体(在后面没有:-),因此只需将查询的参数与该子句的参数统一([1, 2, 3][]L统一[])。虽然很容易统一L5[](用统一的L5 = []),不可能统一[1, 2, 3][]因此,Prolog无法通过使用第一个子句来证明您的查询。然后,它必须尝试使用​​第二个。

它将再次使用子句参数统一查询参数,以查看该子句是否适用:在这里,可以通过unifications来实现H = 1, T = [2, 3], L = [H|R]现在,它必须查看是否满足下面列出的条件:-,因此必须证明copyList(T, R)完全相同的事情进行了两次,直到发现自己试图证明copyList([], R)在那里,第一个子句适用,并且它的工作结束了。

您可以使用图形总结执行情况,如下所示:

copyList([1, 2, 3], L).
|
| try to use clause number 1, doesn't unify with arguments.
| use clause number 2 and L = [1|R]
|
` copyList([2, 3], R).
 |
 | try to use clause number 1, doesn't unify with arguments.
 | use clause number 2 and R = [2|R2]
 |
 ` copyList([3], R2).
  |
  | try to use clause number 1, doesn't unify with arguments.
  | use clause number 2 and R2 = [3|R3]
  |
  ` copyList([], R3).
   |
   | use clause number 1 and R3 = []. One solution found
   | try to use clause number 2, doesn't unify with arguments.
   | No more possibilities to explore, execution over.

现在执行结束了,L通过遵循统一链,我们可以看到原始内容:

L = [1|R]
       R = [2|R2]
              R2 = [3|R3]
                      R3 = []
              R2 = [3]
       R = [2, 3]
L = [1, 2, 3]

感谢威尔·尼斯Will Ness)关于如何解释变量最终值的初衷

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有人可以帮忙解释一下此复制功能吗?

来自分类Dev

来自printf()的随机分段错误,有人可以帮忙解释一下吗?

来自分类Dev

有人可以解释一下这个功能吗?

来自分类Dev

有人可以帮忙解释一下此fft代码段中发生的情况

来自分类Dev

有人可以向我解释一下Java中的哨兵功能吗?或如何运作?

来自分类Dev

有人可以向我解释一下Java中的哨兵功能吗?或它是如何工作的?

来自分类Dev

有人能解释一下这个功能是如何工作的吗?函数{}(函数

来自分类Dev

有人可以解释一下这段代码有什么问题吗?

来自分类Dev

有人可以解释一下Scala的这一行编码吗

来自分类Dev

有人可以向我解释一下Java中的.getClass()方法吗?

来自分类Dev

有人可以解释一下'putExtra()'方法吗?请简单明了

来自分类Dev

有人可以解释一下这种递归的工作方式吗?

来自分类Dev

有人可以解释一下fork的工作原理吗?

来自分类Dev

有人可以解释一下np.log的作用吗?

来自分类Dev

有人可以解释一下这个简单的python代码吗?

来自分类Dev

有人可以解释一下stdio缓冲的工作原理吗?

来自分类Dev

有人可以解释一下C ++ / C#的神奇之处吗?

来自分类Dev

有人可以解释一下按位C代码吗?

来自分类Dev

有人可以解释一下bitMask代码如何工作吗?

来自分类Dev

有人可以解释一下此Java代码的作用吗?

来自分类Dev

有人可以解释一下lspci -vv输出吗?

来自分类Dev

有人可以解释一下这些行代码如何工作吗?

来自分类Dev

有人可以解释一下这到底意味着什么吗?

来自分类Dev

EaselJS:有人可以解释一下演示中使用的继承模式吗?

来自分类Dev

有人可以解释一下这行c ++吗?

来自分类Dev

有人可以解释一下webworker-thread示例吗?

来自分类Dev

有人可以解释一下System.out.println(args [0]);吗?

来自分类Dev

有人可以解释一下用Python编写的此语句的含义吗?

来自分类Dev

有人可以解释一下准备好的陈述吗?

Related 相关文章

  1. 1

    有人可以帮忙解释一下此复制功能吗?

  2. 2

    来自printf()的随机分段错误,有人可以帮忙解释一下吗?

  3. 3

    有人可以解释一下这个功能吗?

  4. 4

    有人可以帮忙解释一下此fft代码段中发生的情况

  5. 5

    有人可以向我解释一下Java中的哨兵功能吗?或如何运作?

  6. 6

    有人可以向我解释一下Java中的哨兵功能吗?或它是如何工作的?

  7. 7

    有人能解释一下这个功能是如何工作的吗?函数{}(函数

  8. 8

    有人可以解释一下这段代码有什么问题吗?

  9. 9

    有人可以解释一下Scala的这一行编码吗

  10. 10

    有人可以向我解释一下Java中的.getClass()方法吗?

  11. 11

    有人可以解释一下'putExtra()'方法吗?请简单明了

  12. 12

    有人可以解释一下这种递归的工作方式吗?

  13. 13

    有人可以解释一下fork的工作原理吗?

  14. 14

    有人可以解释一下np.log的作用吗?

  15. 15

    有人可以解释一下这个简单的python代码吗?

  16. 16

    有人可以解释一下stdio缓冲的工作原理吗?

  17. 17

    有人可以解释一下C ++ / C#的神奇之处吗?

  18. 18

    有人可以解释一下按位C代码吗?

  19. 19

    有人可以解释一下bitMask代码如何工作吗?

  20. 20

    有人可以解释一下此Java代码的作用吗?

  21. 21

    有人可以解释一下lspci -vv输出吗?

  22. 22

    有人可以解释一下这些行代码如何工作吗?

  23. 23

    有人可以解释一下这到底意味着什么吗?

  24. 24

    EaselJS:有人可以解释一下演示中使用的继承模式吗?

  25. 25

    有人可以解释一下这行c ++吗?

  26. 26

    有人可以解释一下webworker-thread示例吗?

  27. 27

    有人可以解释一下System.out.println(args [0]);吗?

  28. 28

    有人可以解释一下用Python编写的此语句的含义吗?

  29. 29

    有人可以解释一下准备好的陈述吗?

热门标签

归档