* :: a → a → a + :: a → a → a - :: a → a → a 0 :: a 1 :: a 2 :: a D :: a → a cons :: c → d → d constant :: a div :: a → a → a false :: b filter :: (c → b) → d → d filter2 :: b → (c → b) → c → d → d ln :: a → a map :: (c → c) → d → d minus :: a → a nil :: d pow :: a → a → a t :: a true :: b D(t) → 1 D(constant) → 0 D(+(X, Y)) → +(D(X), D(Y)) D(*(U, V)) → +(*(V, D(U)), *(U, D(V))) D(-(W, P)) → -(D(W), D(P)) D(minus(X1)) → minus(D(X1)) D(div(Y1, U1)) → -(div(D(Y1), U1), div(*(Y1, D(U1)), pow(U1, 2))) D(ln(V1)) → div(D(V1), V1) D(pow(W1, P1)) → +(*(*(P1, pow(W1, -(P1, 1))), D(W1)), *(*(pow(W1, P1), ln(W1)), D(P1))) map(F2, nil) → nil map(Z2, cons(U2, V2)) → cons(Z2(U2), map(Z2, V2)) filter(I2, nil) → nil filter(J2, cons(X3, Y3)) → filter2(J2(X3), J2, X3, Y3) filter2(true, G3, V3, W3) → cons(V3, filter(G3, W3)) filter2(false, J3, X4, Y4) → filter(J3, Y4)