-- $Id: back_prop.curry,v 1.7 2004/03/31 13:51:15 orlov Exp $

data Data = A | B | C | D

A `eq` A = True
A `eq` B = False
A `eq` C = False
A `eq` D = False
B `eq` A = False
B `eq` B = True
B `eq` C = False
B `eq` D = False
C `eq` A = False
C `eq` B = False
C `eq` C = True
C `eq` D = False
D `eq` A = False
D `eq` B = False
D `eq` C = False
D `eq` D = True

a2b []     = []
a2b (x:xs) | x `eq` A  = B:(a2b xs)
           | otherwise = x:(a2b xs)

back_prop_slow n | (a2b x) =:= (replicate n B) & x =:= (replicate n y) = x
^Iwhere x free; y free

back_prop_fast n | x =:= (replicate n y) & (a2b x) =:= (replicate n B) = x
        where x free; y free