让我们重新排列你的例子:
?- 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).