12

Załóżmy, że chcesz znaleźć program λ nazębnego, T, który spełnia następujące równania:Jakie są najnowocześniejsze metody rozwiązywania równań funkcjonalnych?

(T (λ f x . x))   = (λ a t . a) 
(T (λ f x . (f x)))  = (λ a t . (t a)) 
(T (λ f x . (f (f x)))) = (λ a b t . (t a b)) 
(T (λ f x . (f (f (f x)))) = (λ a b c t . (t a b c)) 

w tej sprawie, mam ręcznie znaleźć tego rozwiązania:

T = (λ t . (t (λ b c d . (b (λ e . (c e d)))) (λ b . b) (λ b . b))) 

Czy istnieje jakąkolwiek strategię rozwiązywania równań z rachunku λ automatycznie? Jaki jest stan wiedzy na ten temat?

+3

Jakiego pojęcia równości używasz tutaj? – dfeuer

+1

[Computational equality] (http://ncatlab.org/nlab/show/equality) *. Przeczytaj "a = b", ponieważ "a" beta redukuje się do "b", w mocnej, normalnej formie. – MaiaVictor

+2

Podczas gdy uważam, że twoje pytanie jest interesujące, nie sądzę, że jest to dobre rozwiązanie do przepełnienia stosu. Jeśli pytasz o algorytmy, powinieneś zapytać na [computer science.SE]. Jak na to pytanie, twoje pytanie nie dotyczy programowania, ale projektowania algorytmów i jest zbyt szerokie, aby można było odpowiedzieć na SO (ostateczną odpowiedzią na twoje pytanie będzie książka/zestawy książek). – Bakuriu

Odpowiedz

3

Ogólnie rzecz biorąc, higher order unification jest nierozstrzygalny, więc nie można liczyć na ogólną procedurę znajdowania rozwiązań tego rodzaju równań.

Było dużo pracy nad znalezieniem rozwiązania takich problemów, ale nie znam żadnej z nich, która daje odpowiedź na konkretny problem. Niektóre dobre referencje są podsumowane w tej odpowiedzi: Higher-order unification

9

Nie jestem pewien co do aktualnego stanu wiedzy, ale praca Williama E Byrda nad tłumaczami relacyjnymi (takimi jak this paper) pozwala na syntezę tego rodzaju programów.

Zobacz także jego PolyConf talk, aby uzyskać kilka fajnych rzeczy podczas wyszukiwania terminów programu. Twoje przykłady wydają się być dość łatwe do wyrażenia w ten sposób.