packages feed

caledon-2.0.0.0: examples/prelude.ncc

---------------
-- builtins ---
---------------
defn char : prop  -- builtin

defn putChar    :  char -> prop -- builtin
   | putCharImp = [A] putChar A

-- for sequencing io actions
fixity left 1 ,
defn io : prop
   | do = io
   | ,  = io -> prop -> io 


defn run : io -> prop
   | runDo = run do
   | runSeq = [A][B] run (A , B) <- run A 
                         	 <- B

defn readLine    : (string -> io) -> prop -- builtin 
   | readLineImp = [Foo : string -> io] [A : string] readLine Foo <- run (Foo A)

defn string : prop
  as list char

---------------
-- searches ---
---------------
defn any : {A : prop} (A -> prop) -> prop
   | is = [a : prop][V : a][F : a -> prop] F V -> any { A = a } F


defn openAny : [A][F : A -> prop] any F -> [V : A] F V -> prop
   | openAnyDef = [A][F : A -> prop][V : A][FV : F V] openAny A F (is A V F FV) V FV

defn sopen : {a : prop }{f : a -> prop} [V : a] {fv : f V} (exists v : a . f v) -> prop 
  as ?\a : prop . ?\ f : a -> prop . \vt : a . ?\ fv : f vt . \an : (exists v : a . f v) . open a f an vt fv


fixity lambda free
defn free : [A : prop] (A -> prop) -> prop
  as \a : prop . any { A = a }

--------------------------
--- useful combinators ---
--------------------------
fixity right 0 $
defn $ : {at bt:prop} (at -> bt) -> at -> bt
  as ?\ at bt . \ f . \a . f a


fixity right 0 @
defn @ : {at bt ct:prop} (bt -> ct) -> (at -> bt) -> at -> ct
  as ?\at bt ct : prop . \f : bt -> ct . \ g : at -> bt . \ a : at . f (g a)

defn flip : {at bt ct : prop} (at -> bt -> ct) -> bt -> at -> ct
  as ?\ at bt ct : prop . \ foo . \ b . \ a . foo a b

-------------------
--- Constraints ---
-------------------
fixity none 1 =:=
defn =:= : {Q} Q -> Q -> prop
   | eq = [a : prop][b:a] (=:=) {Q = a} b b

-- searching for these is SLOW
fixity none 0 /\
defn /\ : prop -> prop -> prop
   | and = [a b : prop] a -> b -> a /\ b

fixity none 0 \/
defn \/ : prop -> prop -> prop
   | or1 = [a b:prop] a -> a \/ b
   | or2 = [a b:prop] b -> a \/ b

fixity left 0 ==
-- currently we can't do any inference inside of definitional signatures
defn == : {q : prop} (q -> prop) -> q -> prop 
  as ?\q . \foo : q -> prop . \v : q . foo v


--------------
--- concat ---
--------------
defn concatable : [M : prop] (M -> M -> M -> prop) -> prop
   | concatableNat = concatable natural add
   | concatableList = [A] 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 

-------------
--- Order ---
-------------
defn orderable : [M : prop] (M -> M -> prop) -> prop
   | orderableNatural = orderable natural lte-nat

fixity right 3 =< 
defn =< : {M : prop}{Foo: M -> M -> prop}{co : orderable M Foo} M -> M -> prop
   | ooimp = [M][Foo : M -> M -> prop] [M1 M2 : M] 
           (=<) {M = M} M1 M2 
          <- orderable M Foo
          <- Foo M1 M2

---------------------
--- Unary Numbers ---
---------------------
defn natural  : prop
   | zero = natural
   | succ = natural -> natural

query findSat0 = free A : natural . A =:= zero

defn add   : natural -> natural -> natural -> prop
   | add_z = [N] add zero N N
   | add_s = [N M R] add N M R -> add (succ N) M (succ R)

query add0 = add (succ zero) zero (succ zero)

query add1 = succ zero ++ zero == succ zero

-- sub N M R is N - M = R
defn sub   : natural -> natural -> natural -> prop
   | sub_by_add = [N M R] sub N M R <- add M R N


defn lte-nat : natural -> natural -> prop
   | leqZero = [B] lte-nat zero B
   | leqSucc = [A B] lte-nat (succ A) (succ B) <- lte-nat A B

fixity none 3 <
defn < : natural -> natural -> prop
   | ltZero = [B] zero < succ B
   | ltSucc = [A B] succ A < succ B <- A < B

query add2 = exists A : natural . add (succ zero) zero A

query add3 = any $ add (succ zero) zero

query findSat1 = succ zero =< succ (succ zero)

query findSat2 = succ zero =< succ (succ zero) /\ zero =< succ (succ zero)

-------------
--- Maybe ---
-------------

defn maybe : prop -> prop
   | nothing = {a} maybe a
   | just = {a} a -> maybe a

-------------
--- Lists ---
-------------
defn list : prop -> prop
   | nil  = {a} list a
   | cons = {a} a -> list a -> list a

defn concatList : {A} list A -> list A -> list A -> prop
   | concatListNil  = [T][L:list T] concatList {A = T} nil L L
   | concatListCons = [T][A B C : list T][V:T] concatList (cons V A) B (cons V C) <- concatList A B C

----------------
--- printing ---
----------------

defn putStr : string -> prop
   | putStr_Nil = putStr $ nil {a = char}
   | putStr_Cons = [v:char][l: string] 
                   putStr $ cons {a = char} v l 
                <- putChar v
                <- putStr l

----------------
--- Booleans ---
----------------
defn bool : prop
   | true = bool
   | false = bool

defn if : bool -> bool
  as \b . b

fixity none 1 |:|
defn |:| : {t:prop} t -> t -> (t -> t -> t) -> t
  as ?\t : prop . \a b : t. \f : t -> t -> t. f a b


fixity none 0 ==>
defn ==> : {A : prop} bool -> ((A -> A -> A) -> A) -> A -> prop
   | thentrue  = [a : prop][f: _ -> a] (true ==> f)  (f (\a1 a2 : a . a1))
   | thenfalse = [b : prop][f: _ -> b] (false ==> f) (f (\a1 a2 : b . a2))

defn not : bool -> bool -> prop
  as \zq . if zq ==> false |:| true

defn ismain : prop 
  as run $ do 
         , putStr "hey!\n"
         , readLine (\A . do 
   	 , putStr A
         , putStr "\nbye!\n")

-- query main = ismain