2016-03-26 16 views
0

SWIProlog içinde bunun nasıl merak tüm değişkenler ile yapısal olarak eşdeğer birine keyfi Prolog terimini dönüştürün [elvis, [idi ölü]]terimi dönüştürmek, örneğin

içine

[A, [B, C]] 

Nasıl Bu keyfi veri yapıları ile yapmak?

Örneğin terim

ty(simple, _) 

içine

ty(A, _) 

dönüştürmek ve

ty(ty(A,), _) 
+0

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

cevap

2
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?

+0

Bazen 2. argüman değişkenleri ilk ve bazen de paylaşmaz. – false

+0

'[_ | _]' için özel durum, sorunları tanıtıyor gibi görünüyor. 'Template_arguments/2' – false

+0

' da benzer bir sorun Evet, çok teşekkürler, hedefin bazı standart yerleşiklerin erişiminden çok uzak olmadığını hissettim, ama '= @ =/2' eyleminden dolayı hayal kırıklığına uğradım. Bir şekilde istediğim, ancak sadece değişkenler tarafından ortaya konan terimler için. En azından, bu çözümün bir şekilde dahil olduğu ve terimi tamamen ayrıştırması gerektiğinden, inanılmaz derecede kolay bir çözüm veya kütüphane işlevini kaçırmadığım için memnunum. – safulop