#! /bin/sh # -*- coding: utf-8 -*- # Copyright (C) 2009, 2010, 2011, 2012 Laboratoire de Recherche et # Développement de l'Epita (LRDE). # Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6), # département Systèmes Répartis Coopératifs (SRC), Université Pierre # et Marie Curie. # # This file is part of Spot, a model checking library. # # Spot is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # Spot is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public # License for more details. # # You should have received a copy of the GNU General Public License # along with Spot; see the file COPYING. If not, write to the Free # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # Check for the equals visitor . ./defs || exit 1 # A few things which are equal run 0 ../equals 'a' 'a' run 0 ../equals '~a' '!a' run 0 ../equals '1' '1' run 0 ../equals '0' '0' run 0 ../equals 'a => b' 'a --> b' run 0 ../equals 'a <-> b' 'a <--> b' run 0 ../equals 'G a ' ' G a' run 0 ../equals 'a U b' 'a U b' run 0 ../equals 'a & b' 'a & b' run 0 ../equals 'a & b' 'b & a' run 0 ../equals 'a & b & c' 'c & a && b' run 0 ../equals 'a & b & c' 'b & c & a' run 0 ../equals 'a && b & a' 'b & a & b' run 0 ../equals 'a & b' 'b & a & b' run 0 ../equals 'a & b' 'b & a & a' run 0 ../equals 'a & b & (c |(f U g)|| e)' \ 'b & a & a & (c | e |(f U g)| e | c) & b' run 0 ../equals 'a & a' 'a' run 0 ../equals 'a & a & true' 'a' run 0 ../equals 'a & false & a' 'false' run 0 ../equals 'a | false | a' 'a' run 0 ../equals 'true | a | a' 'true' # other formulae which are not run 1 ../equals 'a' 'b' run 1 ../equals '1' '0' run 1 ../equals 'a => b' 'b => a' run 1 ../equals 'a => b' 'a <=> b' run 1 ../equals 'a => b' 'a U b' run 1 ../equals 'a R b' 'a U b' run 1 ../equals 'a & b & c' 'c & a' run 1 ../equals 'b & c' 'c & a & b' run 1 ../equals 'a & b & (c |(f U g)| e)' \ 'b & a & a & (c | e |(g U g)| e | c) & b' run 1 ../equals '{a*}' '{a*}<>->1' run 1 ../equals '!{a*}' '{a*}<>->1' run 1 ../equals '{a*}' '{a*}!' run 1 ../equals '!{a*}' '{a*}!' # Precedence run 0 ../equals 'a & b ^ c | d' 'd | c ^ b & a' # Corner cases parsing run 0 ../equals 'FFG__GFF' 'F(F(G("__GFF")))' # Trivial simplifications run 0 ../equals '{0*}<>->a' '{[*0]}<>->a' run 0 ../equals '{[*0]*}<>->a' '{[*0]}<>->a' run 0 ../equals '{Exp**}<>->a' '{Exp*}<>->a' run 0 ../equals 'FF(Exp)' 'F(Exp)' run 0 ../equals 'GG(Exp)' 'G(Exp)' run 0 ../equals 'F(0)' '0' run 0 ../equals 'G(0)' '0' run 0 ../equals 'F(1)' '1' run 0 ../equals 'G(1)' '1' run 0 ../equals 'F({[*0]}<>->1)' 'F({[*0]}<>->1)' run 0 ../equals 'G({[*0]}<>->1)' 'G({[*0]}<>->1)' run 0 ../equals 'F({1}<>->1)' '1' run 0 ../equals 'G({1}<>->1)' '1' run 0 ../equals '!1' '0' run 0 ../equals '!0' '1' run 0 ../equals '!!Exp' 'Exp' run 0 ../equals '(1 => Exp)' 'Exp' run 0 ../equals '(0 => Exp)' '1' run 0 ../equals '(Exp => 1)' '1' run 0 ../equals '(Exp => 0)' '!Exp' run 0 ../equals '(Exp => Exp)' '1' run 0 ../equals '(1 ^ Exp)' '!Exp' run 0 ../equals '(0 ^ Exp)' 'Exp' run 0 ../equals '(Exp ^ Exp)' '0' run 0 ../equals '(0 <=> Exp)' '!Exp' run 0 ../equals '(1 <=> Exp)' 'Exp' run 0 ../equals '(Exp <=> Exp)' '1' run 0 ../equals '(Exp U 1)' '1' run 0 ../equals '(Exp U 0)' '0' run 0 ../equals '(0 U Exp)' 'Exp' run 0 ../equals '(Exp U Exp)' 'Exp' run 0 ../equals '(Exp R 1)' '1' run 0 ../equals '(Exp R 0)' '0' run 0 ../equals '(Exp R Exp)' 'Exp' run 0 ../equals '(1 R Exp)' 'Exp' run 0 ../equals '(Exp W 1)' '1' run 0 ../equals '(0 W Exp)' 'Exp' run 0 ../equals '(1 W Exp)' '1' run 0 ../equals '(Exp W Exp)' 'Exp' run 0 ../equals '(Exp M 0)' '0' run 0 ../equals '(1 M Exp)' 'Exp' run 0 ../equals '(0 M Exp)' '0' run 0 ../equals '(Exp M Exp)' 'Exp' run 0 ../equals FFx Fx run 0 ../equals FFFFFx Fx run 0 ../equals GGx Gx run 0 ../equals GGGGGx Gx run 0 ../equals '!!x' x run 0 ../equals '!!!!!x' '!x' run 0 ../equals '{[*0];x}<>->1' '{x}<>->1' run 0 ../equals '{x;[*0]}<>->1' '{x}<>-> 1' run 0 ../equals '{[*0];x;[*0];[*0]}<>->1' '{x}<>->1' run 0 ../equals '{[*0];x;[*0];x;[*0]}<>->1' '{x;x}<>->1' run 0 ../equals '{x;x;x;[*0];x;x}<>->1' '{x;x;x;x;x}<>->1' run 0 ../equals '{x;0;x;x;x}<>->1' '0' run 0 ../equals '{x;0;x;x;x}[]->1' '1' run 0 ../equals '{0*;1}<>->x' 'x' run 0 ../equals '{[*0]*;1}<>->x' 'x' run 0 ../equals '{x;x}<>->FF(0)' '0' run 0 ../equals '{x;x}<>->GX(1)' '{x;x}<>->1' run 0 ../equals '{x;x}[]->GX(1)' '1' run 0 ../equals '{x;x}[]->FF(0)' '{x;x}[]->0' run 0 ../equals '{x;x}[]->y' '{x;x}|->y' run 0 ../equals '{x;x}[]->y' '{x;x}(y)' run 0 ../equals '{a*}!' '{a*}<>->1' run 0 ../equals '{a -> b} (c)' '!(a->b)|c' run 0 ../equals '{a & !b}!' 'a & !b' run 0 ../equals '{a;[*0]}|->!Xb' '!a | !Xb' run 0 ../equals '{{a;b}:b:c:d*:e:f}!' '{{a;b}:{b && c }:d[*]:{e && f}}!' run 0 ../equals '{a:b:c}|->!Xb' '!(a&&b&&c) | !Xb' run 0 ../equals '{a:b:c*}|->!Xb' '{(a&&b):c*}|-> !Xb' run 0 ../equals '{a&b&c*}|->!Xb' '{(a&&b)&c*}|-> !Xb' run 0 ../equals '{[*]&&a&&[*]}!' 'a' run 0 ../equals '{[*]||a||[*]}!' '{[*]}!' run 0 ../equals '{0&{f;g*}}!' '0' run 0 ../equals '{1&{f;g*}}!' '{f;g*}!' # 1 should not be removed in the following two formulae run 1 ../equals '{1&{g*}}!' '{g*}!' run 1 ../equals '{1|{b;c}}<>->a' '{b;c}<>->a' run 0 ../equals '{1:{a;b}:1:c*}!' '{{a;b}:c*}!' run 0 ../equals '{c*:1:{a;b}:1}!' '{c*:{a;b}}!' # make sure twin arguments are not reduced in Fusion. run 1 ../equals '{(a;!a)*:(a;!a)*:b}!' '{(a;!a)*:b}!' # make sure 1:a* is not reduced to a*. run 1 ../equals '{(1:a*);b}!' '{a*;b}!' run 0 ../equals '{a[*0]}' '{[*0]}' run 0 ../equals '{a[*..]}' '{a[*]}' run 0 ../equals '{a[*2..3][*4..5]}' '{a[*8..15]}' run 0 ../equals '{a[*4..5][*2..3]}' '{a[*4..5][*2..3]}' run 0 ../equals '{a[*2:3][*]}' '{a[*2 to 3][*]}' run 0 ../equals '{a[*1..3][*]}' '{a[*]}' run 0 ../equals '{a[*][*2..3]}' '{a[*]}' run 0 ../equals '{a[*..3][*2]}' '{a[*..6]}' run 0 ../equals '{a[*..3][*to2]}' '{a[*:6]}' run 0 ../equals '{a[*..3][*2..$]}' '{a[*]}' run 0 ../equals '{a[*..3][*2:]}' '{a[*:inf]}' run 0 ../equals '{a[*1..]}' '{a[+]}' run 0 ../equals '{a[*1]}' '{a}' run 0 ../equals '{a[+][*1..3]}' '{a[+]}' run 0 ../equals '{a[*1..3][+]}' '{a[+]}' run 0 ../equals '{[*2][+]}' '{[*2][+]}' run 0 ../equals '{[+][*2]}' '{[*2..inf]}' run 0 ../equals '{0[=2]}' '0' run 0 ../equals '{0[=2..]}' '0' run 0 ../equals '{0[=1..10]}' '0' run 0 ../equals '{0[=0]}' '{[*]}' run 0 ../equals '{0[=0..10]}' '{*}' run 0 ../equals '{0[=0..]}' '{*}' run 0 ../equals '{1[=0]}' '{[*0]}' run 0 ../equals '{1[=1..2]}' '{[*1,2]}' run 0 ../equals '{1[=..4]}' '{1[*..4]}' run 0 ../equals '{b[=0]}' '{(!b)[*]}' run 0 ../equals '{b[=0to$]}' '{*}' run 0 ../equals '{0[->10..100];b}' '0' run 0 ../equals '{0[->1..];b}' '0' run 0 ../equals '{0[->0,100];b}' 'b' run 0 ../equals '{0[->0..$];b}' 'b' run 0 ../equals '!{1[->0];b}' '!b' run 0 ../equals '{1[->10,20];b}' '{[*10..20];b}' run 0 ../equals '{1[->..];b}' '{[*1..];b}' run 0 ../equals '{{a&!c}[->0];b}' 'b'