[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: resubmit question : string

Kong Woei Susanto wrote:
> Hi,
> I am sorry for this multiple question.
> I have tried the example from Dave and Sam.
> Unfortunetly, the proof sequence in dave mail (4 Nov 97)
> or sam mail (4 Mar 96) stop when the string is
> transform to list.
> Seems that 'cons_lem' and 'char_lem' not recognized.
> Am I missing something ?

The problem is likely to come from the distinction between
the types 'finseq[(char?)]' and 'string' (i.e. finseq[character]).

The rule 'fseq_lem' in theory 'string_lemmas' matches
equalities between terms of type 'string' but not between
terms of type 'finseq[(char?)]'.

The string literals (i.e. "abcd") are of type 'finseq[(char?)]' not 
of type 'string'. This means that you cannot show

   test1: LEMMA NOT "abcd" = "abce" 

by (AUTO-REWRITE-THEORY "string_lemmas")(ASSERT) because 'fseq_lem'
does not math.

However, if you try

   a: string = "abcd"
   b: string = "abce"

   test2: LEMMA NOT a=b

then (AUTO-REWRITE-THEORY "string_lemmas")(EXPAND* "a" "b")
(ASSERT) works because 'fseq_lem' matches.

It gets even more hairy if you use /=. You can prove

   test3: LEMMA a /= b 


(GROUND)(EXPAND* "a" "b")

but not by 

(EXPAND* "a" "b")(GROUND)

A solution is to extend "string_lemmas" so that there
is a rule for both cases:

  string_lemmas: THEORY

    l1, l2: VAR list[(char?)]

    c1, c2: VAR (char?)

    fseq_lem1: LEMMA
         list2finseq(l1): string = list2finseq(l2) IFF l1 = l2

    fseq_lem2: LEMMA
         list2finseq(l1) = list2finseq(l2) IFF l1 = l2
    cons_lem: LEMMA cons(c1,l1) = cons(c2,l2) IFF c1 = c2 & l1 = l2

    char_lem: LEMMA c1 = c2 IFF code(c1) = code(c2)

    END string_lemmas


Bruno Dutertre                             | bruno@csl.sri.com
CSL, SRI International                     | fax: 650 859-2844
333 Ravenswood Avenue, Menlo Park CA 94025 | tel: 650 859-2717