修剪指定深度的树。在Prolog

时间:2018-06-15 08:37:11

标签: tree prolog binary-tree trim depth

参数:任意二叉树;必要的深度;结果树。

结果:

?- pred(s(f(b(m,k),a),t(a,g)),2,X). 
X = s(f,t) yes 
?- pred(s(f(b(m,k),a),t(a,g)),3,X). 
X = s(f(b,a),t(a,g)) yes 
?-

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

让我们重新安排你的例子:

?- pred( s( f(b(m,k),a), t(a,g)), 3, X). 
X = s(f(b,a),t(a,g)) yes

?- pred( s( f(b(m,k),a), t(a,g)), 2, X). 
X = s(f,t) yes 

?- pred( s( f(b(m,k),a), t(a,g)), 1, X). 
X = s yes 

?- pred( s( f(b(m,k),a), t(a,g)), 0, X). 
no

现在很清楚需要做什么,不是吗?

这个难题的另一个部分是所谓的“univ”谓词,=..

9 ?- s( f(b(m,k),a), t(a,g)) =.. [A, B, C].
A = s,
B = f(b(m, k), a),
C = t(a, g).

10 ?- X =.. [s, f(b(m,k),a), t(a,g)].
X = s(f(b(m, k), a), t(a, g)).

11 ?- X =.. [s, f(b,a), t(a,g)].
X = s(f(b, a), t(a, g)).

12 ?- X =.. [s, f, t].
X = s(f, t).

13 ?- X =.. [s].
X = s.

14 ?- s =.. X.
X = [s].

这就是你可以拆分数据并重新构建它的方法。

最后,您需要使用递归:

recursion(       In, Out) :-
  base_relation( In, Out).

recursion(       In, Out) :-
  constituents(  In,     SelfSimilarParts,                 LeftOvers),
  maplist( recursion,     SelfSimilarParts, InterimResults),
  constituents(      Out,                  InterimResults, LeftOvers).