离开二叉树 - 列表和列表

时间:2016-05-22 09:56:17

标签: prolog

我将实现从树到列表中的所有叶子,反之亦然 - 对于叶子构建树的列表 - 我知道这样的树是虚拟的。

leaves(nil) --> 
    [].

leaves(t(X, nil, nil)) --> 
    [X].
leaves(t(_, t(Y, L, R), nil)) -->
    leaves(t(Y, L, R)).

leaves(t(_, t(X, LL, LR), t(Y, RL, RR))) -->
    leaves(t(X, LL, LR)),
    leaves(t(Y, RL, RR)).

似乎甚至可以工作,例如

phrase( leaves(  t(6, t(3, 
            t(1, nil, nil), 
            t(5, nil, nil)
        ),           
        t(4, 
            t(2, nil, nil), 
            t(8, 
                t(7, nil, nil), 
                t(9, nil, nil)
            )
        )
    )
    ), X).
X = [1, 5, 2, 7, 9] ;
false.

正如所料,一个结果。然而,问题反之亦然 - 它是循环的 - 当然很明显有这样的树 - 但我不会给出任何结果。

phrase(leaves(X), [1, 5, 2, 7, 9])正在循环,但是对于 phrase(leaves(X), [1])它似乎以预期的方式运作:

X = t(1, nil, nil) ;
X = t(_G8388509, t(1, nil, nil), nil) ;
X = t(_G8388509, t(_G8388513, t(1, nil, nil), nil), nil) 

是否可以实现它,以便它对单元素列表的工作方式相同?

修改

在重新检查您之前的答案后,我得出以下结论:

leaves(nil, Ls, Ls) --> [].

leaves(t(X, nil, nil), Ls, Ls) -->[X].

leaves(t(_, t(Y, L, R), nil), [_|Ls0], Ls) -->
    leaves(t(Y, L, R), Ls0, Ls).

leaves(t(_, nil, t(Y, L, R)), [_|Ls0], Ls) -->
    leaves(t(Y, L, R), Ls0, Ls).

leaves(t(_, t(X, LL, LR), t(Y, RL, RR)), [_|Ls0], Ls) -->
    leaves(t(X, LL, LR), Ls0, Ls1),
    leaves(t(Y, RL, RR), Ls1, Ls).

phrase(leaves(X, [1,2], _), [1,2]).
X = t(_G1522, t(_G1526, t(1, nil, nil), t(2, nil, nil)), nil) ;
X = t(_G1522, nil, t(_G1526, t(1, nil, nil), t(2, nil, nil))) ;
X = t(_G1522, t(1, nil, nil), t(2, nil, nil)) ;
X = t(_G1522, t(1, nil, nil), t(_G1530, t(2, nil, nil), nil)) ;
X = t(_G1522, t(1, nil, nil), t(_G1530, nil, t(2, nil, nil))) ;
X = t(_G1522, t(_G1526, t(1, nil, nil), nil), t(2, nil, nil)) ;
X = t(_G1522, t(_G1526, nil, t(1, nil, nil)), t(2, nil, nil)) ;
false.

我预计会有一些结果,但我得到了有限的结果。但是,这是不正确的?

0 个答案:

没有答案