Fusionsgesetz für foldr1?

8

Für foldr haben wir das Fusionsgesetz : Wenn f streng ist, f a = b und

f (g x y) = h x (f y) für alle x, y , dann f . foldr g a = foldr h b .

Wie kann man ein ähnliches Gesetz für foldr1 entdecken / ableiten? (Es kann natürlich nicht einmal die gleiche Form annehmen - bedenke, dass beide Seiten auf [x] handeln.)

    
Fixnum 25.07.2011, 02:36
quelle

2 Antworten

10

Sie können freie Sätze verwenden, um Aussagen wie das Fusionsgesetz abzuleiten. Die Automatische Generierung von freien Theoremen funktioniert für Sie, Die folgende Anweisung wird automatisch abgeleitet, wenn Sie foldr1 oder den Typ (a -> a -> a) -> [a] -> a eingeben.

Wenn f strict und f (p x y) = q (f x) (f y)) für alle x und y haben Sie f (foldr1 p z) = foldr1 q (map f z)) . Das heißt, im Gegensatz zu Ihrer Aussage über foldr erhalten Sie auf der rechten Seite ein zusätzliches map f .

Beachten Sie auch, dass das freie Theorem für foldr etwas allgemeiner ist als Ihr Fusionsgesetz und daher dem Gesetz für foldr1 ziemlich ähnlich sieht. Nämlich für die strikten Funktionen g und f wenn g (p x y) = q (f x) (g y)) für alle x und y dann g (foldr p z v) = foldr q (g z) (map f v)) .

    
Jan Christiansen 25.07.2011, 07:25
quelle
2

Ich weiß nicht, ob etwas für foldr1 befriedigend sein wird. [Ich denke] Es ist nur definiert als

%Vor%

Lassen Sie uns zuerst erweitern, was Sie oben haben, um an der gesamten Liste zu arbeiten,

%Vor%

für foldr1, könnte man sagen,

%Vor%

um in foldr1 zu rekondensieren, können Sie eine imaginäre Funktion erstellen, die f auf das linke Element abbildet, für ein Ergebnis von

%Vor%     
gatoatigrado 25.07.2011 07:00
quelle