Prolog - 列出树中的连接

时间:2015-05-06 09:56:43

标签: prolog dcg

我必须写一个谓词ListInTree(T,X),当T是一个在每个节点中都有一个列表的树时,这是真的,而X是所有列表的串联(假设在预订中访问)。 / p>

我真的无法理解如何使用递归来访问所有树。

由于

2 个答案:

答案 0 :(得分:2)

你没有说明你所追求的是什么树,所以我必须猜测。在这种情况下,最好的是使用DCG,因为语法是以最自然的方式建立连接模型:

    public function stage_EnterFrame(e:Event)
    {   
        var num:Number = _microphone.activityLevel;
        trace("in the stage_entrance");
        trace(thisStage.getChildByName("micIndicator"));
        trace("===========================");
        thisActivity.play();
        if (thisStage.getChildByName("micIndicator") == null) {
            trace("no recorder movie clip");
            thisStage.addChild(thisActivity);
        }
        trace(thisActivity.currentFrame);
        thisActivity.gotoAndStop(uint((num/100)*29));
    }

答案 1 :(得分:1)

为了举例,让我们假设树的以下表示形式:

  • 原子nil代表空树。
  • 结构tree/3代表非空树tree( Left , Right , Payload ),其中LeftRight代表(分别和递归)左右子树,Payload }是节点的有效负载:在您的情况下,是一个列表。

许多/大多数递归问题都有1或2个特殊情况"而更一般的情况。这没有什么不同:

特殊情况是空树:展平它会产生空列表。

一般情况是非空树:展平它包含以下步骤:

  • 展平左子树以生成列表
  • 将右侧子树展平以生成列表
  • 结果是通过串联获得的

    • 扁平的左子树
    • 当前节点的有效负载
    • 扁平的右子树

实现此目的的Prolog代码与上面的英文描述完全相同:

flatten_tree( nil                      , []     ) .  % flattening the empty tree yields an empty list, n'est-ce-pas?
flatten_tree( tree(Left,Right,Payload) , Result ) :- % flattening a non-empty tree consists of
   flatten_tree( Left  , Prefix ) ,                  % - flattening the left subtree,
   flatten_tree( Right , Suffix ) ,                  % - flattening the right subtree,
   concatenate( Prefix , Payload , Suffix , Result ) % - concatenating the three parts
   .                                                 % - easy!

concat( Xs, Ys , Zs , Rs ) :-
  append(Xs,Ys,T1) ,
  append(T1,Zs,Rs)
  .

有人可能会注意到另一种方法可能是使用findall/3append/2(如果你正在使用SWI prolog)。

首先,你需要一个谓词来通过回溯来访问树:

visit( tree(L,_,_) , P ) :- visit( L , P ) . % visit the left subtree
visit( tree(_,_,P) , P ) .                   % visit the current node
visit( tree(_,R,_) , P ) :- visit( R , P ) . % visit the right subtree

随意重新排列条款的顺序,以获得您喜欢的订单。一旦你有了这个,压扁树是微不足道的:

flatten_tree( Tree , List ) :-
  findall( X, visit(Tree,X) , Xs ) ,
  append(Xs,List)
  .