@@ -11,11 +11,12 @@ use crate::{bool::cv::CharVec, ltl::cm::CharMatrix};
1111use super :: traits:: Commutativity ;
1212
1313#[ derive( Debug , Copy , Clone , PartialEq , Eq , Hash ) ]
14- /// Binary LTL Operators: Or, And, Until
14+ /// Binary LTL Operators: Or, And, Until, Release, Implication and Equivalence
1515pub enum LtlBinaryOp {
1616 Or ,
1717 And ,
1818 Until ,
19+ Release ,
1920 Implies ,
2021 Equivalent ,
2122}
@@ -24,12 +25,15 @@ impl LtlBinaryOp {
2425 /// Returns a list of all binary operators.
2526 pub ( crate ) fn all ( ) -> Vec < LtlBinaryOp > {
2627 use LtlBinaryOp :: * ;
27- vec ! [ Or , And , Until , Implies , Equivalent ]
28+ vec ! [ Or , And , Until , Release , Implies , Equivalent ]
2829 }
2930
3031 /// Whether this LTL operator is boolean.
3132 pub ( crate ) fn is_boolean ( & self ) -> bool {
32- matches ! ( self , LtlBinaryOp :: Or | LtlBinaryOp :: And )
33+ matches ! (
34+ self ,
35+ LtlBinaryOp :: Or | LtlBinaryOp :: And | LtlBinaryOp :: Implies | LtlBinaryOp :: Equivalent
36+ )
3337 }
3438
3539 /// Apply the operator to two characteristic vectors.
@@ -41,6 +45,8 @@ impl LtlBinaryOp {
4145 match op {
4246 LtlBinaryOp :: Or => lhs. bitor ( rhs) ,
4347 LtlBinaryOp :: And => lhs. bitand ( rhs) ,
48+ LtlBinaryOp :: Implies => lhs. implies ( rhs) ,
49+ LtlBinaryOp :: Equivalent => lhs. equiv ( rhs) ,
4450 _ => panic ! (
4551 "Cannot apply non-boolean operator {} to characteristic vectors" ,
4652 op
@@ -54,6 +60,7 @@ impl LtlBinaryOp {
5460 LtlBinaryOp :: Or => lhs. or ( rhs) ,
5561 LtlBinaryOp :: And => lhs. and ( rhs) ,
5662 LtlBinaryOp :: Until => lhs. until ( rhs) ,
63+ LtlBinaryOp :: Release => lhs. release ( rhs) ,
5764 LtlBinaryOp :: Implies => lhs. implies ( rhs) ,
5865 LtlBinaryOp :: Equivalent => lhs. equiv ( rhs) ,
5966 }
@@ -64,7 +71,7 @@ impl Commutativity for LtlBinaryOp {
6471 fn commutes ( & self ) -> bool {
6572 match self {
6673 LtlBinaryOp :: Or | LtlBinaryOp :: And | LtlBinaryOp :: Equivalent => true ,
67- LtlBinaryOp :: Until | LtlBinaryOp :: Implies => false ,
74+ LtlBinaryOp :: Until | LtlBinaryOp :: Release | LtlBinaryOp :: Implies => false ,
6875 }
6976 }
7077}
@@ -85,6 +92,7 @@ impl<'a> TryFrom<&'a str> for LtlBinaryOp {
8592 /// | `"\|"` | [`LtlBinaryOp::Or`] |
8693 /// | `"&"` | [`LtlBinaryOp::And`] |
8794 /// | `"U"` | [`LtlBinaryOp::Until`]|
95+ /// | `"R"` | [`LtlBinaryOp::Release`]|
8896 /// | `"->"` | [`LtlBinaryOp::Implies`]|
8997 /// | `"<->"` | [`LtlBinaryOp::Equivalent`]|
9098 /// | Other value | `Error` |
@@ -93,6 +101,7 @@ impl<'a> TryFrom<&'a str> for LtlBinaryOp {
93101 "|" => Ok ( LtlBinaryOp :: Or ) ,
94102 "&" => Ok ( LtlBinaryOp :: And ) ,
95103 "U" => Ok ( LtlBinaryOp :: Until ) ,
104+ "R" => Ok ( LtlBinaryOp :: Release ) ,
96105 "->" => Ok ( LtlBinaryOp :: Implies ) ,
97106 "<->" => Ok ( LtlBinaryOp :: Equivalent ) ,
98107 _ => Err ( InvalidBinaryOp ( value) ) ,
@@ -106,6 +115,7 @@ impl Display for LtlBinaryOp {
106115 LtlBinaryOp :: And => write ! ( f, "&" ) ,
107116 LtlBinaryOp :: Or => write ! ( f, "|" ) ,
108117 LtlBinaryOp :: Until => write ! ( f, "U" ) ,
118+ LtlBinaryOp :: Release => write ! ( f, "R" ) ,
109119 LtlBinaryOp :: Implies => write ! ( f, "->" ) ,
110120 LtlBinaryOp :: Equivalent => write ! ( f, "<->" ) ,
111121 }
@@ -127,6 +137,15 @@ mod test {
127137 let parsed = "U" . try_into ( ) ;
128138 assert_eq ! ( parsed, Ok ( LtlBinaryOp :: Until ) ) ;
129139
140+ let parsed = "R" . try_into ( ) ;
141+ assert_eq ! ( parsed, Ok ( LtlBinaryOp :: Release ) ) ;
142+
143+ let parsed = "->" . try_into ( ) ;
144+ assert_eq ! ( parsed, Ok ( LtlBinaryOp :: Implies ) ) ;
145+
146+ let parsed = "<->" . try_into ( ) ;
147+ assert_eq ! ( parsed, Ok ( LtlBinaryOp :: Equivalent ) ) ;
148+
130149 let parsed: Result < LtlBinaryOp , _ > = ":" . try_into ( ) ;
131150 assert ! ( parsed. is_err( ) ) ;
132151 }
0 commit comments