[Agda] `postulate' in `let'

Serge D. Mechveliani mechvel at botik.ru
Thu Aug 23 11:31:32 CEST 2012


Can you, please, explain the difference of `where' and `let' constructs
with respect to `postulate' ?
Consider the following small program using 
Agda-2.3.0.1 + Standad library lib-0.6
(in which I replace the math symbols with  Nat  and  `subtract'):

------------------------------------------
lessNat? : Nat -> Nat -> Bool  
lessNat? 0       0       = false
lessNat? 0       (suc _) = true
lessNat? (suc _) 0       = false
lessNat? (suc n) (suc m) = lessNat? n m

LessNat? : Nat -> Nat -> Set
LessNat? n m = T (lessNat? n m)

f : (n : Nat) -> LessNat? 7 n -> Nat
f n _ = subtract n 8                  -- subtract = \.-  -- math symbol

g : Nat -> Nat
g n = f m p  where
             m = (n + 3) * (n + 3)
             postulate p : LessNat? 7 m

-- I am testing `postulate' because I imagine for  m  some expression of 
-- which value I am sure that it is greater than 7, and which formal 
-- inequality proof is difficult to provide.

g2 : Nat -> Nat                       -- a variant of  g
g2 n = let m = (n + 3) * (n + 3)
           postulate p : LessNat? 7 m
       in  f m p

h : Nat -> Nat
h n = let L7 : Set           -- just some test example with `let'
          L7 = LessNat? 7 n
          h' : Nat -> Nat
          h' n = n + 2 
      in  h' (n * n)
-------------------------------------------

Now,  g  and  h  are compiled,  
and  g2  is not:
                 "Not a valid let-declaration when scope checking".

What is the meaning of this difference?
Thanks,

------
Sergei


More information about the Agda mailing list