pisigma-0.1.0.3: examples/Equal.pi
Eq : (a:Type) -> a -> a -> Type;
Eq = \ a x y -> (P : a -> Type) -> P x -> P y;
refl : (a:Type) -> (x:a) -> Eq a x x;
refl = \ a x P px -> px;
A : Type;
a : A;
b : A;
b = a;
t0 : Eq A a b;
t0 = refl A a;
{-
c : A;
t1 : Eq A a c;
t1 = refl A a;
-}
d : ^A;
d = [a];
t2 : Eq (^A) d [a];
t2 = refl (^A) [a];
{-
t3 : Eq (^A) [a] [b];
t3 = refl (^A) [a];
-}
e : A;
e = a;
t4 : Eq (^A) [e] [b];
t4 = refl (^A) [e];
id : A -> A;
id = \ x -> x;
f : A;
f = id a;
t5 : Eq (^A) [f] [b];
t5 = refl (^A) [f];
{-
? f = b
? id a = a [f=b=b]
-}
t6 : Eq A (id a) a;
t6 = refl A a;
c:A;
t7 : Eq (A*(^A)) (let x:A=a in (a,[x])) (a,let x:A=a in [x])
= refl (A*(^A)) (let x:A=a in (a,[x]));
t8 : Eq (A*(^A)) (let x:A=a in (a,[x])) (a,let x:A=a in [x])
= refl (A*(^A)) (let x:A=a in (a,[x]));
{-
t8a : Eq (^A) (let x:A=a in [x]) (let x:A=c in [x])
= refl (^A) (let x:A=c in [x]);
-}
t9 : Eq (^(A * A)) (let x:A=a; y:A=c in [(x,y)]) (let y:A=c; x:A=a in [(x,y)])
= refl (^(A * A)) (let x:A=a; y:A=c in [(x,y)]);
t9a : Eq (^(A * A)) (let x:A=a; y:A=c in [(x,y)]) (let y:A=c; x:A=a in [(x,y)])
= refl (^(A * A)) (let x:A=a; y:A=c in [(x,y)]);
t10 : Eq (^A) (let x:A=a in [x]) (let x:A=a;y:A=x in [y])
= refl (^A) (let x:A=a in [x]);
{- according due to the draft rules (Friday 30/10/09) should not work. -}
t11 : Eq (^(^A)) [let x:A=a in [x]] [let x:A=a;y:A=x in [y]]
= refl (^(^A)) [let x:A=a in [x]];
{- works, uses bet equality in contexts. -}
t11a : Eq (^(^A)) [let x:A=a in [x]] [let y:A=a in [y]]
= refl (^(^A)) [let x:A=a in [x]];
{- works now -}
t12 : Eq (^A) (let y:A=y in [y]) (let z:A=z in [z])
= refl (^A) (let y:A=y in [y]);
{-
t13 : Eq (^A) [let x:A=a in x] [a]
= refl (^A) [a];
{- doesn't work and shouldn't. -}
-}
Stream : Type;
Stream = A * [∞ Stream];
as : Stream;
as = (a, [as]);
repeat : (x : A) → Stream;
repeat = λ x → (x, [repeat x]);
-- as is equal to its unfolding.
unfolds : Eq Stream as (a, [as]);
unfolds = refl Stream as;
-- repeat a is not equal to its unfolding.
{-
doesNotUnfold : Eq Stream (repeat a) (a, [repeat a]);
doesNotUnfold = refl Stream (repeat a);
-}