我正在尝试为subtree(S,T)
编写一个程序,其中S
是T
的子树。
这是我的程序,不幸的是它不起作用,我不知道为什么。我是Prolog的新手,所以请温柔。
subtree(T,T).
subtree(S,tree(X,left,right)) :-
subtree(S,left).
subtree(S,tree(X,left,right)) :-
subtree(S,right).
subtree(tree(X,void,void),tree(X,left,right)).
subtree(tree(X,S_left,S_right),tree(X_left,right)) :-
subtree(S_left,X_left),
subtree(S_right,X_right).
前两个规则用于查找范围为树的叶子的子树。最后两条规则应该找到不属于叶子的子树。
如果我是致电
subtree(tree(one,void,void),tree(one,tree(two,void,void),tree(three,void,void))).
Prolog返回false
,我不知道为什么,这不是规则:
subtree(tree(X,void,void),tree(X,left,right)).
准确捕获该查询?
答案 0 :(得分:0)
all_subtree(leaf(X), leaf(X)).
all_subtree(node(Left,Right),Variable):-
all_subtree(Left,Variable); all_subtree(Right,Variable);
Variable = node(Left,Right).
这里有一些可能有用的代码。此代码输出给定树的所有子树(使用叶子和节点代码)。
基本情况是两个叶子包含相同的值。递归以分支因子2发生。在每次调用时,再次进行2次all_subtree函数调用,1表示节点的左子节点,1表示节点的右子节点。 “变量”保持不变,并且在每次迭代时被简单地约束为等于节点。
有些注意事项是此代码仅适用于二叉树。
现在您已经有了一些有用的代码来返回给定树的所有子树,您可以考虑修改此代码以获得所需的行为。我实际上不确定你想要你的代码到底是什么问题。