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-bool-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 <javascript:>> 
> 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,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,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 <javascript:>.
>> To post to this group, send email to ats-lan...@googlegroups.com 
>> <javascript:>.
>> 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/68469c62-1ab0-4d0c-936b-e8775877b5f3%40googlegroups.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.

Reply via email to