Hi,
had just liked to flip over a predicate transformer that I tinkered
with today.
------------------------------------------------------------------------------
( n : Nat !
data (---------! where (------------! ; !-------------!
! Nat : * ) ! zero : Nat ) ! suc n : Nat )
------------------------------------------------------------------------------
( n : Nat ! ( i : Fin n !
data !-----------! where (------------------! ; !--------------------!
! Fin n : * ) ! fz : Fin (suc n) ) ! fs i : Fin (suc n) )
------------------------------------------------------------------------------
( A, B : * ! ( a : A ! ( b : B !
data !------------! where !----------------! ; !----------------!
! Or A B : * ) ! inl a : Or A B ) ! inr b : Or A B )
------------------------------------------------------------------------------
( n : Nat ; P : Fin n -> * !
let !---------------------------!
! Any n P : * )
Any n P <= rec n
{ Any n P <= case n
{ Any zero P => Fin zero
Any (suc n) P => Or (Any n (lam i => P (fs i))) (P fz)
}
}
------------------------------------------------------------------------------
( n : Nat ; P : Fin n -> * ; p : Any n P !
let !------------------------------------------!
! findex n P p : Fin n )
findex n P p <= rec n
{ findex n P p <= case n
{ findex zero P p <= case p
findex (suc n) P p <= case p
{ findex (suc n) P (inl a) => fs (findex n (lam i => P (fs i)) a)
findex (suc n) P (inr b) => fz
}
}
}
------------------------------------------------------------------------------
( n : Nat ; P : Fin n -> * ; p : Any n P !
let !------------------------------------------!
! find n P p : P (findex n P p) )
find n P p <= rec n
{ find n P p <= case n
{ find zero P p <= case p
find (suc n) P p <= case p
{ find (suc n) P (inl a) => find n (lam i => P (fs i)) a
find (suc n) P (inr b) => b
}
}
}
------------------------------------------------------------------------------
( A : * ; B : A -> * ! ( a : A ; b : B a !
data !---------------------! where !---------------------!
! Sigma A B : * ) ! tup a b : Sigma A B )
------------------------------------------------------------------------------
( n : Nat ; P : (Fin n) -> * ; p : Any n P !
let !--------------------------------------------!
! chexist n P p : Sigma (Fin n) P )
chexist n P p => tup (findex n P p) (find n P p)
------------------------------------------------------------------------------
I was hoping it could be useful for formulating the pigoeon hole
principle.
------------------------------------------------------------------------------
( i : Fin (suc n) ; j : Fin n !
let !------------------------------!
! thin i j : Fin (suc n) )
thin i j <= rec i
{ thin i j <= case i
{ thin fz j => fs j
thin (fs i) j <= case j
{ thin (fs i) fz => fz
thin (fs i) (fs j) => fs (thin i j)
}
}
}
------------------------------------------------------------------------------
( A, B : * ! ( a : A ; b : B !
data !-------------! where !--------------------!
! And A B : * ) ! pair a b : And A B )
------------------------------------------------------------------------------
( n : Nat ; P : Fin n -> * !
let !---------------------------!
! All n P : * )
All n P <= rec n
{ All n P <= case n
{ All zero P => Fin (suc zero)
All (suc n) P => And (All n (lam i => P (fs i))) (P fz)
}
}
------------------------------------------------------------------------------
( i ; j !
data !-----------! where (-------------!
! H i j : * ) ! occ : H i j )
------------------------------------------------------------------------------
[ ( n : Nat ; p : All (suc n) (lam i => Any n (lam j => H i j)) !!
!let !--------------------------------------------------------------!!
! ! PHP n p : Any n (lam j => Any (suc! (lam i => !! !!
! ! ! !% n) ! And (H i j) !! !!
! ! ! ! % (H (thin i j) j))) )]
------------------------------------------------------------------------------
Cheers,
Sebastian