-- $Id: back_prop_slow.xsg,v 1.5 2004/03/31 13:51:15 orlov Exp $

data Char = A | B | C | D
data String = NIL | CONS Char String
data Int = O | I Int

F :: String -> String String
F x = A2B x x

A2B :: String -> String
A2B NIL       = NIL
A2B CONS A xs = CONS B A2B xs
A2B CONS x xs = CONS x A2B xs 

G :: Int Char -> String String
G n y = Replicate n B Replicate n y

Repeat :: Char -> String
Repeat x = CONS x Repeat x

Take :: Int String -> String
Take O _ = NIL
Take I n CONS x xs = CONS x Take n xs

Replicate :: Int Char -> String
Replicate n x = Take n Repeat x