You might define the sublist relation :

  Sublist [] l = T
  Sublist _ [] = F
  Sublist (h1::t1) (h2::t2) = if h1 = h2 then Sublist t1 t2 else Sublist 
(h1::t1) t2

And show that

  Sublist (DELETE_ELEMENT e l) l

This doesn’t capture the idea that the only missing elements are e’s though.  
This definition of Sublist might not be the easiest to work with…

Michael

On 11/10/17, 22:31, "Chun Tian" <binghe.l...@gmail.com> wrote:

    Hi,
    
    I’d like to close an old question.  3 months ago I was trying to define the 
free names in CCS process but failed to deal with list deletions.   Today I 
found another way to delete elements from list, inspired by DROP:
    
    val DELETE_ELEMENT_def = Define `
       (DELETE_ELEMENT e [] = []) /\
       (DELETE_ELEMENT e (x::l) = if (e = x) then DELETE_ELEMENT e l
                                         else x::DELETE_ELEMENT e l)`;
    
    And the previous definition suggested by Ramana based on FILTER now becomes 
a theorem as alternative definition:
    
       [DELETE_ELEMENT_FILTER]  Theorem
    
          |- ∀e L. DELETE_ELEMENT e L = FILTER (λy. e ≠ y) L
    
    I found it’s easier to use the recursive definition, because many useful 
results can be proved easily by induction on the list. For example:
    
       [EVERY_DELETE_ELEMENT]  Theorem
    
          |- ∀e L P. P e ∧ EVERY P (DELETE_ELEMENT e L) ⇒ EVERY P L
    
       [LENGTH_DELETE_ELEMENT_LE]  Theorem
    
          |- ∀e L. MEM e L ⇒ LENGTH (DELETE_ELEMENT e L) < LENGTH L
    
       [LENGTH_DELETE_ELEMENT_LEQ]  Theorem
    
          |- ∀e L. LENGTH (DELETE_ELEMENT e L) ≤ LENGTH L
    
       [NOT_MEM_DELETE_ELEMENT]  Theorem
    
          |- ∀e L. ¬MEM e (DELETE_ELEMENT e L)
    
    What I actually needed is LENGTH_DELETE_ELEMENT_LE, but 3 months ago I just 
couldn’t prove it!
    
    However, I still have one more question: how can I express the fact that 
all elements in (DELETE_ELEMENT e L) are also elements of L, with exactly the 
same order and number of appearances?   In another words, by inserting some “e” 
into (DELETE_ELEMENT e L) I got the original list L?
    
    Regards,
    
    Chun Tian
    
    > Il giorno 02 lug 2017, alle ore 10:23, Ramana Kumar 
<ramana.ku...@cl.cam.ac.uk> ha scritto:
    > 
    > Sure, that's fine. I probably wouldn't even define such a constant but 
would instead use ``FILTER ((<>) x) ls`` in place.
    > 
    > Stylistically it's usually better to use Define instead of 
new_definition, and to name defining theorems with a "_def" suffix. I'd also 
keep the name short like "DELETE" or even "delete".
    > 
    > On 2 Jul 2017 17:04, "Chun Tian (binghe)" <binghe.l...@gmail.com> wrote:
    > Hi,
    > 
    > It seems that ListTheory didn’t provide a way to remove elements from 
list? What’s the recommended way to do such operation? Should I use FILTER, for 
example, like this?
    > 
    > val DELETE_FROM_LIST = new_definition (
    >    "DELETE_FROM_LIST", ``DELETE_FROM_LIST x list = (FILTER (\i. ~(i = x)) 
list)``);
    > 
    > Regards,
    > 
    > Chun
    > 
    > 
    > 
------------------------------------------------------------------------------
    > Check out the vibrant tech community on one of the world's most
    > engaging tech sites, Slashdot.org! http://sdm.link/slashdot
    > _______________________________________________
    > hol-info mailing list
    > hol-info@lists.sourceforge.net
    > https://lists.sourceforge.net/lists/listinfo/hol-info
    > 
    
    

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
hol-info mailing list
hol-info@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/hol-info

Reply via email to