Der folgende λ-Term, hier in normaler Form:
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))
Implementiert einen Sortieralgorithmus für kirchenkodierte Listen. Das heißt, das Ergebnis von:
sort (λ c n . (c 3 (c 1 (c 2 n)))) β→ (λ c n . (c 1 (c 2 (c 3 n))))
Ähnlich,
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))))
Implementiert auch die Sortierung für dieselben Listen wie oben, außer dass Sie ein zusätzliches Argument mit einer Begrenzung für die berücksichtigten Zahlen angeben müssen:
sort_below 4 [5,1,3,2,4] → [1,2,3]
Ich versuche festzustellen, ob diese Begriffe auf elementarer affiner Logik typisierbar sind. Da ich keinen öffentlich verfügbaren EAL-Typprüfer kenne, ist dies eine schwierigere Aufgabe als erwartet. Gibt es einen Typ für sort
in der elementaren affinen Logik?
lo.logic
lambda-calculus
type-systems
MaiaVictor
quelle
quelle
Antworten:
Ich denke
sort
, wie dort dargestellt, ist auf EAL nicht typisierbar. Ich kann das nicht beweisen, aber es funktioniert nicht mit Lampings abstraktem Algorithmus ohne das Orakel. Obwohl der Begriff etwas klug und kurz ist, verwendet er sehr verrückte Strategien, die nicht EAL-freundlich sind.Hinter dieser Frage steht jedoch eine interessantere: "Kann eine Nat-Sortierfunktion in EAL implementiert werden ? " Das war damals eine sehr schwierige Frage, aber jetzt sieht es ziemlich trivial aus. Ja natürlich. Es gibt viele einfachere Möglichkeiten, dies zu tun. Zum Beispiel kann man einfach ein Scott-codiertes
NatSet
mit Church-codiertemNat
s füllen und es dann in eine Liste konvertieren. Hier ist eine vollständige Demonstration:Hier ist die bruijn-indizierte Normalform einer leicht veränderten Version des
sort
oben genannten, die(x -> (x x))
als erstes Argument empfangen werden muss, um zu funktionieren (ansonsten hat sie keine Normalform):Rückblickend ziemlich einfach.
quelle