我将实现从树到列表中的所有叶子,反之亦然 - 对于叶子构建树的列表 - 我知道这样的树是虚拟的。
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.
我预计会有一些结果,但我得到了有限的结果。但是,这是不正确的?