packages feed

caledon-3.1.0.0: prelude/concatable.ncc

#include <naturals.ncc>
#include <list.ncc>

--------------
--- concat ---
--------------

defn concatable : [M : prop] (M -> M -> M -> prop) -> prop
  >| concatableNat = concatable natural add
  >| concatableList = concatable (list A) concatList

-- it correctly infers 169, and M (but it eta expands Foo when it infers it) !!
fixity right 3 ++
defn ++ : {M}{Foo}{cm : concatable M Foo} M -> M -> M -> prop
   | ppimp = [M][Foo : M -> M -> M -> prop][M1 M2 M3 : M] 
               (++) {Foo = Foo} M1 M2 M3 
            <- concatable M Foo 
            <- Foo M1 M2 M3