Recursion 问题中的递归决策树

Recursion 问题中的递归决策树,recursion,prolog,Recursion,Prolog,所以我试图画出两个Prolog问题的决策树,一个使用累加器,另一个不使用累加器。以下是我的问题和解决方案: length([H|T],N) :- length(T,N1), N is N1+1. length([ ],0). Goal: ?: length([1,2,3],N) 带蓄能器的第二个: length_acc(L,N) :- len_acc(L,0,N). len_acc([H|T], A, N) :- A1 is A+1, len_acc(T, A1, N). len_acc

所以我试图画出两个Prolog问题的决策树,一个使用累加器,另一个不使用累加器。以下是我的问题和解决方案:

length([H|T],N) :- length(T,N1), N is N1+1.
length([ ],0). 
Goal: ?: length([1,2,3],N) 

带蓄能器的第二个:

length_acc(L,N) :- len_acc(L,0,N).
len_acc([H|T], A, N) :- A1 is A+1, len_acc(T, A1, N).
len_acc([], A, A). 
Goal: ?-length_acc([1,2], N).

决策树绘制是否正确?还是我犯了错误?绘制这种递归决策树的正确方法是什么


谢谢。

您所指的树通常称为搜索树又名SLD树,不要与证明树混淆

您概述的两个问题都是搜索树最简单的情况:

  • 只有一个解决办法
  • 查询没有失败
  • 搜索中的每个步骤只能匹配一个子句(空列表与非空列表)
这三个特征意味着SLD树中只有一个分支

您将获得以下搜索树

请注意,要使其成为正确的搜索树,每个步骤最多只能解决一个目标,这使得搜索树非常大。。。因此,人们通常会制作简化的树,在每个步骤中可以解决多个目标,这可以说不是真正的搜索树,而是以更简洁的方式说明搜索

作为统一算法的一部分,树中的边用应用于变量的替换标记

搜索树与跟踪密切相关,通常可以直接将程序跟踪转换为搜索树

我建议您研究具有多个答案的查询的搜索树和可能失败的分支,这将提供具有多个分支的更有趣的树。斯特林·夏皮罗的《序言艺术》中的一个例子:

节目:

father(abraham, isaac).        male(isaac)
father(haran, lot).            male(lot).
father(haran, milcah).         female(milcah).
father(haran, yiscah).         female(yiscah).

son(X,Y):- father(Y,X), male(X).
daughter(X,Y):- father(Y,X), female(X).
查询:

?: son(S, haran) 
搜索树:

father(abraham, isaac).        male(isaac)
father(haran, lot).            male(lot).
father(haran, milcah).         female(milcah).
father(haran, yiscah).         female(yiscah).

son(X,Y):- father(Y,X), male(X).
daughter(X,Y):- father(Y,X), female(X).

理解某些东西的一个好方法是自己重新实现它

当您已经有了Prolog来实现它时,实现Prolog特别好。:)

程序(家长,P):-
P=[%[son(S,haran)],%预解式
[神父(亚伯拉罕,以撒)]%。。。
,[父亲(哈兰,地段)]%[头部,身体…]
,[父亲(米尔卡哈兰)]
,[父亲(哈兰,伊斯卡)]
,[男(艾萨克)]
,[男(地段)]
,[女(米尔卡)]
,[女(伊斯卡)]
,[儿子(X,Y),父亲(Y,X),男性(X)]
,[女儿(X,Y),父亲(Y,X),女性(X)]
].
解决(程序):-
程序=[[]||].%空解决方案—成功
解决([[Goal | Res]|子句]):-
成员(规则、条款),
复制|u项(规则,[头|体]),%重命名变量
目标=人头,人头百分比
追加(正文、Res、Res2),%替换目标
解决([Res2 |子句])。
查询(What,query):-%query是要解决的目标列表
程序(什么,程序),
求解([Query | Program])。
测试

23?-询问(族长,[儿子,哈兰)]。
S=批次;
错。

现在,可以对上面的
solve/1
进行扩充,以记录
Goal
成功实例化的记录,从而使统一
Goal=Head
成为可能。

我认为这些树更好地被称为SLD树,而不是决策树..是的,也许吧。不过我知道如何解决查询。