/*----------------------------------------------------------------------
--  User rules for procedure Latch.UpdateInternalLatch.
--
--  File name: updateinternallatch.rlu
--
--  Description:
--    Procedure rule file.
--
--  Author: Phil Thornley, April 2009.  See www.sparksure.com
--
-- Copyright (c) 2009, Phil Thornley
-- All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions
-- are met:
--
--  * Redistributions of source code must retain the above copyright
--    notice, this list of conditions and the following disclaimer.
--
--  * Redistributions in binary form must reproduce the above copyright
--    notice, this list of conditions and the following disclaimer in
--    the documentation and/or other materials provided with the distribution.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------*/


/*----------------------------------------------------------------------
--  Rule 1
--
--  Justification:
--    C1 and (1)1 are equivalent:
--      latch__islocked(S2) and islocked(fld_currentlatch(S2)) are the
--      external and internal views of the same function.
--    C2 and (1)2 are equivalent:
--      The proof function prf_latchTimeout(State) models the value of
--      the LatchTimeout component of the refinement of State; the
--      equivalence is completed by (2)
--
--    It follows that C and (1) are equivalent expressions.
----------------------------------------------------------------------*/
updateinternallatch_user(1):
   latch__islocked(S2) <->                                /* C1 */
     clock__greaterthanorequal(T, prf_latchtimeout(S2))   /* C2 */
   may_be_deduced_from
   [ islocked(fld_currentlatch(S2)) <->                   /* (1)1 */
       clock__greaterthanorequal(T, fld_latchtimeout(S)), /* (1)2 */
     fld_latchtimeout(S) = fld_latchtimeout(S2) ] .       /* (2)  */
