Prolog中的子树程序

时间:2015-12-03 14:46:05

标签: prolog

我正在尝试为subtree(S,T)编写一个程序,其中ST的子树。

这是我的程序,不幸的是它不起作用,我不知道为什么。我是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)).

准确捕获该查询?

1 个答案:

答案 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表示节点的右子节点。 “变量”保持不变,并且在每次迭代时被简单地约束为等于节点。

有些注意事项是此代码仅适用于二叉树。

现在您已经有了一些有用的代码来返回给定树的所有子树,您可以考虑修改此代码以获得所需的行为。我实际上不确定你想要你的代码到底是什么问题。