我正在使用 SWI Prolog 研究 Prolog,我发现这个代码片段有很多困难,如果 2 个二叉树有 N 个公共子树(具有相同的根):
/* BASE CASE: T1 and T2 are two tree composed of only the root X so it is
TRUE that they have exactly one common subtree
*/
delta(tree(X,[]),tree(X,[]),1):- !.
/* RULE: T1 and T2 are DIFFERENT and are structured tree.
It is TRUE that T1 and T2 have N subtrees if it is TRUE that:
*/
delta(tree(X,RX),tree(X,RX1),N):- sons(RX,SX),
sons(RX1,SX)
subdelta(RX,RX1,N),
!.
/* Else whatever T1 and T2 it is true that they have 0 common tree
(here we are in the case that the previous delta\2 predicate are
boot failed)
*/
delta(_,_,0):- !.
subdelta([],[],1).
subdelta([T1|R1],[T2|R2], N):-
delta(T1,T2,N1),
subdelta(R1,R2, NR),
N is (1 + N1)*NR.
我认为如果第一棵树与第二棵树有 N 个公共子树,那么delta/3谓词是正确的
他以这种方式说唱这棵树:
tree(F, LIST_OF_SUBTREES).
例如,这是一棵由根 X 和两片叶子 u 和 v 组成的树:
tree(x, [tree(u,[]), tree(v,[])])
我认为delta/3谓词被拒绝为 3 种可能的情况:
1) T1 和 T2 是仅由根 X 组成的两棵树,因此它们只有一个公共子树是正确的
**2) T1 和 T2 是不同的,并且是具有更多级别的结构化树,因此如果 T1 和 T2 具有 N 个子树,则为 TRUE:?!?!
3) 否则,如果前面的 delta\2 谓词都失败了,那么无论 T1 和 T2 是否它们有 0 个公共树都是真的
我认为这种解释是正确的(我希望如此......)但我在理解第二条规则时遇到了一些困难:什么可能是sons/2谓词(在我看来,这是注意内置谓词的 SWI Prolog 和我在我正在学习的幻灯片上没有它的实现)
什么是给你的?它的逻辑是什么?
肿瘤坏死因子
安德烈亚