The built-in solver in ATS is very limited in its handling of datasorts like the following one:
datasort item = | a | b | c In practice, I try to use integers instead: sortdef item = int #define item_a 0 #define item_b 1 #define item_c 2 On Tue, Apr 17, 2018 at 4:12 PM, M88 <abysgr...@gmail.com> wrote: > I've been experimenting with Z3 and it's proven to be very useful. I > would like to keep using the built-in constraint solver for various reasons. > > Perhaps this is a novice question, but how does one establish equality > within a datasort? > > For example, given datasort > > datasort item > | a > | b > | c > > How can I establish that a == a ? > > I can use scase, but that is only optimal for a small number of branches. > It would be nice to use sif. > > I can declare a static function like > stacst item_id : (item) -> int > stacst item_eq : (item,item) -> bool > > extern praxi item_uniq : [ > item_id(a) == 1; > item_id(b) == 2; > item_id(c) == 3 > ] void > > extern praxi item_eq_praxi{a,b:item} : [ > item_eq(a,b) == (item_id(a) == item_id(b)) > ] void > > But the constraint solver still gives me errors, because either > item_eq(a,b) == (a == b) does not resolve (eg, in a sif branch), or > vice-versa (eg, in nested scase). > > > On Sunday, April 8, 2018 at 7:47:12 AM UTC-4, gmhwxi wrote: >> >> >> There are two styles of theorem-proving in ATS: >> >> http://ats-lang.sourceforge.net/EXAMPLE/EFFECTIVATS/PwTP-boo >> l-vs-prop/index.html >> >> To avoid explicit quantifier elimination performed by the following code, >> >> prval () = isCA1_praxi{cB_1}() >> prval () = isCA1_praxi{cB_2}() >> prval () = isCA1_praxi{cB_3}() >> >> you can try: >> >> prval() = $solver_assert(isCA1_praxi) >> >> and then use Z3 to solve the generated constraints. Doing so means that you >> are at the mercy >> >> of Z3's quantifier elimination heuristics or (black) magic. >> >> >> >> On Sat, Apr 7, 2018 at 9:09 PM, M88 <abys...@gmail.com> wrote: >> >>> >>> It seems that isCA1_praxi should be declared >>>> as follows: >>>> >>>> praxi >>>> isCA1_praxi{cb:catB} (): [isCA1(sA_1(cA_1,cb))] void >>>> >>> >>> Yes, this makes sense -- I am looking for universal quantification. >>> >>> I suppose the issue here is how it would be invoked. Would I >>> still need to invoke the proof as follows? >>> >>> prval () = isCA1_praxi{cB_1}() >>> prval () = isCA1_praxi{cB_2}() >>> prval () = isCA1_praxi{cB_3}() >>> >>> ******** >>> >>> After giving this some thought, I realized I could invoke the proof >>> within a constructor, omitting the need to explicitly specify each >>> "catB." >>> >>> fun makeCA1 {cb:catB}() : [sa:sortA | isCA1(sa) ] typeA(sa) >>> >>> What tripped me up at first is that the return value of each constructor >>> should specify the constraint "isCA1" if I use this approach, whereas >>> the former let me invoke the proofs globally. >>> >>> >>> On Saturday, April 7, 2018 at 12:25:05 AM UTC-4, M88 wrote: >>>>> >>>>> >>>>> I was looking into the rock-paper-scissors example (here >>>>> <https://groups.google.com/forum/#!topic/ats-lang-users/YcdEzhJdJzs> >>>>> and here >>>>> <https://github.com/githwxi/ATS-Postiats-test/blob/master/contrib/hwxi/TEST20/test25.dats>) >>>>> and I found it very useful for learning how to define predicates in the >>>>> statics. >>>>> >>>>> I had made an attempt something similar, but using independent >>>>> datasorts as parameters. >>>>> >>>>> For example: >>>>> >>>>> datasort catA = >>>>> | cA_1 >>>>> <https://maps.google.com/?q=cA_1+%C2%A0%C2%A0+%7C+cA_2&entry=gmail&source=g> >>>>> | cA_2 >>>>> <https://maps.google.com/?q=cA_1+%C2%A0%C2%A0+%7C+cA_2&entry=gmail&source=g> >>>>> | cA_3 >>>>> >>>>> datasort catB = >>>>> | cB_1 >>>>> | cB_2 >>>>> | cB_3 >>>>> >>>>> datasort sortA = >>>>> | sA_1 of (catA, catB) >>>>> | sA_2 >>>>> | sA_3 >>>>> >>>>> // only sortA is used to define types. Eg, >>>>> abst@ype typeA(sortA) >>>>> >>>>> I ran into a few issues. I arrived at a solution, but I thought it >>>>> could be cleaner. >>>>> >>>>> First, I discovered that I wasn't able to define equalities with >>>>> datasorts. Eg, {sa:sortA | sa == sA_2}. It would typecheck, but the >>>>> constraints could not be solved. I suppose this makes sense, considering >>>>> the definition of ==. Does ATS supply a way to determine equalities on >>>>> datasorts? Is there another feature that would make this unnecessary? >>>>> >>>>> As an alternative, I decided to declare a static predicate, as in the >>>>> rock-paper-scissors example: >>>>> >>>>> stacst isCA1 : sortA -> bool >>>>> >>>>> // This works, but becomes quite verbose. >>>>> praxi isCA1_praxi (): >>>>> [ >>>>> isCA1(sA_1(cA_1 >>>>> <https://maps.google.com/?q=1(cA_1&entry=gmail&source=g>,cB_1)) && >>>>> isCA1(sA_1(cA_1 >>>>> <https://maps.google.com/?q=1(cA_1&entry=gmail&source=g>,cB_2)) && >>>>> isCA1(sA_1(cA_1 >>>>> <https://maps.google.com/?q=1(cA_1&entry=gmail&source=g>,cB_3)) >>>>> ] void >>>>> >>>>> The verbosity isn't an issue in this example, but becomes pretty >>>>> unmanageable as the relationships get more complex. I would like to say, >>>>> "for any catB". I tried using universal and existential quantification, >>>>> but the constraints would not solve. I would like to avoid passing catB >>>>> explicitly. >>>>> >>>>> Is there a way to reduce it to something like this: >>>>> >>>>> // The constraints will not solve: >>>>> praxi isCA1_praxi (): >>>>> [ cb: catB | >>>>> isCA1(sA_1(cA_1 >>>>> <https://maps.google.com/?q=1(cA_1&entry=gmail&source=g>,cb)) >>>>> ] void >>>>> >>>>> Perhaps I am abusing datasorts -- suggestions for other approaches are >>>>> welcome. >>>>> >>>>> >>>>> -- >>> 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-user...@googlegroups.com. >>> To post to this group, send email to ats-lan...@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/ms >>> gid/ats-lang-users/68469c62-1ab0-4d0c-936b-e8775877b5f3%40go >>> oglegroups.com >>> <https://groups.google.com/d/msgid/ats-lang-users/68469c62-1ab0-4d0c-936b-e8775877b5f3%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> >> -- > 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/82adac20-edf8-4974-ad88-32455de26f16% > 40googlegroups.com > <https://groups.google.com/d/msgid/ats-lang-users/82adac20-edf8-4974-ad88-32455de26f16%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- 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/CAPPSPLoc2h47U-k1S1Ai3R3gA13%3Dahk3hkwqH0_3UWidBscWHw%40mail.gmail.com.