Następujący termin λ, tutaj w formie normalnej:
sort = (λabc.(a(λdefg.(f(d(λhij.(j(λkl.(k(λmn.(mhi))l))
(h(λkl.l)i)))(λhi.(i(λjk.(bd(jhk)))(bd(h(λjk.(j
(λlm.m)k))c)))))e))(λde.e)(λde.(d(λfg.g)e))c))
Implementuje algorytm sortowania dla list zakodowanych w kościele. Oznacza to, że wynik:
sort (λ c n . (c 3 (c 1 (c 2 n)))) β→ (λ c n . (c 1 (c 2 (c 3 n))))
Podobnie,
sort_below = λabcd.a(λef.f(λghi.g(λj.h(λkl.kj(ikl)))(hi))e(λgh.h))
(λe.d)(λe.b(λf.e(f(λghi.hg)(λgh.cfh))))
Implementuje również sortowanie dla tych samych list jak powyżej, z tym wyjątkiem, że musisz podać dodatkowy argument z ograniczeniem liczby, które będzie rozważał:
sort_below 4 [5,1,3,2,4] → [1,2,3]
Próbuję ustalić, czy te terminy można pisać na elementarnej logice afinicznej. Ponieważ nie znam publicznie dostępnego sprawdzania typu EAL, jest to trudniejsze zadanie, niż się spodziewałem. Czy istnieje typ sort
elementarnej logiki afinicznej?
lo.logic
lambda-calculus
type-systems
MaiaVictor
źródło
źródło
Odpowiedzi:
Wydaje mi się, że
sort
tak, jak tam przedstawiono, nie można pisać na EAL. Nie mogę tego udowodnić, ale nie działa on na abstrakcyjnym algorytmie Lampinga bez wyroczni. Co więcej, chociaż termin ten jest dość sprytny i krótki, wykorzystuje bardzo zwariowane strategie, które nie są przyjazne dla EAL.Ale za tym pytaniem kryje się bardziej interesujące pytanie: „czy w EAL można zaimplementować funkcję sortowania nat” ? To było wtedy bardzo trudne pytanie, ale teraz wygląda dość trywialnie. Tak oczywiście. Istnieje wiele prostszych sposobów, aby to zrobić. Na przykład, można po prostu wypełnić kodowany przez Scott
NatSet
kodekNat
s, a następnie przekonwertować go na listę. Oto pełna demonstracja:Oto indeksowana przez bruijn normalna wersja nieco zmienionej wersji
sort
powyższej, którą należy otrzymać(x -> (x x))
jako pierwszy argument, aby zadziałał (w przeciwnym razie nie ma normalnej postaci):Całkiem proste z perspektywy czasu.
źródło