Recursion 递归的逐步帮助

Recursion 递归的逐步帮助,recursion,prolog,Recursion,Prolog,我的老师问我,我已经看过很多在线文本教程,试图通过提问来获得更全面的递归知识,但是我仍然在努力理解如何实现它。我理解这个定义,因为它涉及到函数本身的调用,以及它被用来以更高效、更紧凑的方式编写某些代码部分的事实 我尤其难以理解递归是如何工作的,以及如何实现它来遍历列表中的项。对于给定给我们的问题集,我们需要使用递归来遍历并查找列表中的特定项。让我感到困惑的部分是列表的[H | T]部分,以及如何列出符合条件的项目并将其列在新列表中 有人能给我举一个小例子,每个步骤都解释了,我可以作为一个向导,尝

我的老师问我,我已经看过很多在线文本教程,试图通过提问来获得更全面的递归知识,但是我仍然在努力理解如何实现它。我理解这个定义,因为它涉及到函数本身的调用,以及它被用来以更高效、更紧凑的方式编写某些代码部分的事实

我尤其难以理解递归是如何工作的,以及如何实现它来遍历列表中的项。对于给定给我们的问题集,我们需要使用递归来遍历并查找列表中的特定项。让我感到困惑的部分是列表的[H | T]部分,以及如何列出符合条件的项目并将其列在新列表中

有人能给我举一个小例子,每个步骤都解释了,我可以作为一个向导,尝试独立地解决我的问题集。这真的很有帮助,因为通过提前阅读,我对Prolog是新手,我知道这是一项至关重要的技能,我需要掌握才能更有效地使用该语言


您的帮助会很好。

Prolog中的列表是一个非常简单的数据结构:

  • 一个空列表是prolog atom
    []
  • 非空列表是序言术语
    (H,T)
    ,其中
    • H
      是列表开头的列表项,并且
    • “T”是列表的尾部,这是另一个序言列表
最后一个列表节点的尾部是空列表,如果您想这样看的话,它是最里面的列表节点。其他所有内容都是非空列表

Prolog的列表方括号符号(
[a,b,c]
)只是上述数据结构上的一种静态符号

  • []
    是空列表
  • [a]
    完全等同于
    (a,[])
  • [a,b]
    完全等同于
    (a,.(b,[])
  • [a,b,c]
    完全等同于
    (a,.(b,([]))
  • 以此类推(我们可以很容易地看出为什么人们更喜欢方括号表示法而不是
    /2
    表示法)
Head/Tail操作符
|
只是更具语法意义:

  • [H | T]
    完全等同于
    (H,T)
当我说上面完全相等时,我的意思是与一致。如果你说

[A,B,C] = .(a,.(b,.(c,[])))
它将评估为
true
(成功),您将获得

A = a, B = b , C = c
下面是一个简单的带注释的列表遍历示例:

member_of_list(_,[])      :- % the empty list has no members.
  fail.                      % - so we fail (Note that this clause is redundant, since it will fail appropriately without it.)
member_of_list(X,[X|Xs] ).   % X is a member of the non-empty list, if it is found at the head of the list.
member_of_list(X,[_|Xs] ) :- % otherwise, we discard the head of the list, and
  member_of_list(X,Xs).      %  recurse down on the tail of the list.

如果您在调试器中处理它,或者在调试器中添加一些日志记录,以便查看发生了什么,可能会有所帮助。

嗨,Nicholas-您的第二个子句缺少目标(:-true.或just.而不是:-)。我所看到的最好的解释是:子句和效果:工作程序员的Prolog编程一书