içine terimin ty (ty (karmaşık, _) _)
dönüştürmek
Örnekler, bir terimden yapılmış bir şablonu terimini istediğinizi önerir. Bağlı bir terim bir ağaç olarak gösterilebildiği için, terim şablonunun yapısı, bağlı ağaç yapraklarının taze değişkenler ile değiştirilmesi olarak görülebilir. Bu nedenle, bir çözüm ağacı çaprazlamak ve yapraklarına gerekli dönüşümü yapmaktır. Bu, standart functor/3
ve =../2
yüklemleri kullanılarak gerçekleştirilebilir.
% template(@term, -term)
template(Term, Template) :-
( var(Term) ->
true
; Term = [_| _] ->
template_arguments(Term, Template)
; functor(Term, Functor, Arity),
functor(Template, Functor, Arity),
Term =.. [Functor| Arguments],
Template =.. [Functor| TemplateArguments],
template_arguments(Arguments, TemplateArguments)
).
template_arguments([], []).
template_arguments([Argument| Arguments], [TemplateArgument| TemplateArguments]) :-
( compound(Argument) ->
template(Argument, TemplateArgument)
; % variables and atomic terms
true
),
template(Arguments, TemplateArguments).
Bazı sorgular: Örneğin:
?- template(ty(ty(complex, _), _), Template).
Template = ty(ty(_G1211, _G1212), _G1191).
?- template([elvis, [was, dead]], Template).
Template = [_G1196, [_G1202, _G1205]].
?- template([elvis, [was, dead]| _], Template).
Template = [_G1199, [_G1205, _G1208]|_G1117].
Belki sorunu çözmek için bu çözümü uyum sağlayabilir?
G 'nin ne için bekliyorsun? Ty (T, G)' için: 'T = [a | non_list]' 'T = [[]]'? Görünüşe göre, [] uzaklaştırarak genellemek istemiyorsunuz, ama bu oldukça zor. – false