2015-06-02 5 views
5

Nehmen wir an, ich habe eine Liste scott-encoded wie:Gibt es einen nicht rekursiven Ausdruck, der sich über eine scott-codierte Liste faltet?

scott = (\ c n -> c 1 (\ c n -> c 2 (\ c n -> c 3 (\ c n -> n)))) 

möchte ich eine Funktion, die eine solche Art von Liste empfängt und wandelt es in einer aktuellen Liste ([1,2,3]), mit der Ausnahme, dass eine solche Funktion nicht rekursiv sein kann. Das heißt, es muss in der eta-beta-Normalform sein. Gibt es diese Funktion?

+0

Für diese spezifische Liste, ja es existiert. Aber du meinst sicherlich eine Funktion, die beliebig viele Listen beliebig lange aufnehmen kann und eine Standardliste zurückgibt, oder? – chi

+1

Ja, das meine ich. – MaiaVictor

+2

Sollte es nicht '\ c n -> c 3 (\ c n -> n)' am Ende der Liste sein? –

Antwort

2

OK, ich gebe es eine Chance. Fühlen Sie sich frei, mich zu korrigieren, weil ich kein Experte darin bin.

Für beliebige x und xs muss es sein, dass toList (\c n -> c x xs) zu einer Laufzeit reduziert, die x : toList xs umwandelbar ist.

Dies ist nur möglich, wenn wir die linke Seite zu c x xs reduzieren, indem (\c n -> c x xs) einige c und n zu Anwendung. Also toList ~ (\f -> f ? ?). (Übrigens, das ist der Teil, an dem ich nicht an ein schönes strenges Argument denken konnte; ich hatte einige Ideen, aber keine sehr nette. Ich wäre glücklich, Tipps zu hören).

Jetzt muss es der Fall sein, dass c x xs ~ (x : toList xs). Aber da x und xs unterschiedliche universelle Variablen sind, und sie die einzigen Variablen sind, die auf der rechten Seite vorkommen, ist die Gleichung in Miller's pattern fragment und daher ist c ~ (\x xs -> x : toList xs) ihre allgemeinste Lösung.

So muss toList auf (\f -> f (\x xs -> x : toList xs) n) für einige n reduzieren. Natürlich kann toList keine normale Form haben, da wir das rekursive Vorkommen immer entfalten können.

+0

Ich bekomme nicht den Splitter-Teil des Millers, aber er sieht sehr korrekt aus. – MaiaVictor

+0

Haftungsausschluss: Ich bin (offensichtlich) nicht ganz sicher, ob das korrekt ist. – MaiaVictor

Verwandte Themen