Ah thank you for catching that, I have a habit of always writing my inequalities with LT, forgot that the arguments were the other way around!
So having $solver_assertion (lemma_safesub_b) isn't going to work in this case? Must reach for an external solver? On Tuesday, April 18, 2017 at 4:58:35 AM UTC-7, gmhwxi wrote: > > > >>stadef safesub_b = lte_int_int > > Should it be > > stadef safesub_b = gte_int_int > > ? > > For typechecking mysub_b, you need to use Z3 to solve the > generated constraints. > > On Tuesday, April 18, 2017 at 7:44:33 AM UTC-4, spearman wrote: >> >> As an exercise I'm trying to define a safe subtraction function for >> natural numbers in a few different ways (subsorts, props, or boolean >> predicates) but I am having trouble figuring out the boolean predicate case: >> >> #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 >> ) >> >> The above should compile but un-commenting the last function call gives >> an unresolved constraint. >> >> There are a couple examples in the documentation around ATS that include >> examples of the boolean predicate style for fibonacci and factorial >> functions, but so far I haven't succeeded in translating that style to this >> function. fib and fact functions are defined inductively, and the predicate >> relates the input and output integers, so you have some existential >> quantification on the output, and no restriction on the input (defined for >> all naturals). This case (safesub) seems to be the opposite: the predicate >> relates only the inputs to each other. Really it looks almost the same as >> the first subsort implementation, but if I try this: >> >> stadef safesub_b = lte_int_int >> >> fun mysub_b { m,n:nat | safesub_b(m,n) } (x:int m, y:int n) : int = x - y >> >> the unresolved constraint remains. >> > -- You received this message because you are subscribed to the Google Groups "ats-lang-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to ats-lang-users+unsubscr...@googlegroups.com. To post to this group, send email to ats-lang-users@googlegroups.com. Visit this group at https://groups.google.com/group/ats-lang-users. To view this discussion on the web visit https://groups.google.com/d/msgid/ats-lang-users/ddf22c9f-4cb1-4374-96ea-a80d84b6d7d3%40googlegroups.com.