#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"
// safe subtract subsort
fun mysub { m,n:nat | n <= m } (x:int m, y:int n) : int = x - y
// safe subtract prop
dataprop safesub_p (int, int)
= { m,n:nat | n <= m } mk_safesub_p (m,n)
fun mysub_p { m,n:int }
(pf : safesub_p (m,n) | x:int m, y:int n) : int
= x - y
// safe subtract pred
stacst safesub_b : (int, int) -> bool
extern praxi lemma_safesub_b { m,n:nat | n <= m }
() : [safesub_b (m,n)] unit_p
fun mysub_b { m,n:nat | safesub_b(m,n) }
(x:int m, y:int n) : int
= let prval () = $solver_assert (lemma_safesub_b) in
x - y
end
implement main0 () = (
println!("mysub (5,4): ", mysub (5,4));
println!("mysub_p (mk_safesub_p | 5,4): ",
mysub_p (mk_safesub_p | 5,4));
//println!("mysub_b (5,4): ", mysub_b (5,4)); // error: unresolved constraint
)