diff --git a/btypes_primitives/src/main/rust/btypes/src/bset.rs b/btypes_primitives/src/main/rust/btypes/src/bset.rs index a5aa61e0001c374cf1c481e2070d5ac311750446..6fb0bb483764473e071f72c2fba105c55024e6be 100644 --- a/btypes_primitives/src/main/rust/btypes/src/bset.rs +++ b/btypes_primitives/src/main/rust/btypes/src/bset.rs @@ -404,6 +404,9 @@ impl<T: 'static + SetLike> BSet<T> { } pub fn unary_intersect(&self) -> T { - return self.iter().fold(T::get_empty(), |result, next| result.intersect(next)); + match self.iter().cloned().reduce(|result, next| result.intersect(&next)) { + Some(v) => return v, + None => panic!("Error: inter applied to empty set!"), + } } } \ No newline at end of file diff --git a/src/main/resources/de/hhu/stups/codegenerator/RustTemplate.stg b/src/main/resources/de/hhu/stups/codegenerator/RustTemplate.stg index 64535298305b489a7ecaedde6ecf9faa28448f67..a2416fcad3e0920eda4b474b7e4d5329ea04ebee 100644 --- a/src/main/resources/de/hhu/stups/codegenerator/RustTemplate.stg +++ b/src/main/resources/de/hhu/stups/codegenerator/RustTemplate.stg @@ -307,7 +307,7 @@ for <identifier> in <set>.pow().iter().cloned() { iteration_construct_subsetneq(otherIterationConstructs, type, identifier, set, body) ::= << <otherIterationConstructs> -for <identifier> in <set>.pow().difference(<set>).iter().cloned() { +for <identifier> in <set>.pow().iter().filter(|e| e.unequal(&<set>)).cloned() { <body> } >> @@ -327,15 +327,24 @@ let mut <identifier> = <if(isRelation)>BRelation::\<<leftType>, <rightType>\><el <comprehension> >> -set_comprehension_predicate(otherIterationConstructs, set, element, emptyPredicate, predicate, isRelation, leftType, rightType, subType) ::= << +set_comprehension_predicate(otherIterationConstructs, set, element, emptyPredicate, predicate, isRelation, leftType, rightType, subType, hasCondition, conditionalPredicate) ::= << +//set_comprehension_predicate <otherIterationConstructs> <if(emptyPredicate)> <set> = <set>._union(&<if(isRelation)>BRelation::\<<leftType>, <rightType>\><else>BSet::\<<subType>\><endif>::new(vec![<element>])); <else> +<if(hasCondition)> +if (<conditionalPredicate>).booleanValue() { + if (<predicate>).booleanValue() { + <set> = <set>._union(&<if(isRelation)>BRelation::\<<leftType>, <rightType>\><else>BSet::\<<subType>\><endif>::new(vec![<element>])); + } +} +<else> if (<predicate>).booleanValue() { <set> = <set>._union(&<if(isRelation)>BRelation::\<<leftType>, <rightType>\><else>BSet::\<<subType>\><endif>::new(vec![<element>])); } <endif> +<endif> >> lambda(type, identifier, lambda, leftType, rightType) ::= << @@ -403,6 +412,7 @@ if <conditionalPredicate>.booleanValue() { >> quantified_expression_evaluation(otherIterationConstructs, emptyPredicate, predicate, identifier, operation, expression) ::= << +//quantified_expression_evaluation <otherIterationConstructs> <if(emptyPredicate)> <identifier> = <identifier>.<operation>(&<expression>); @@ -418,11 +428,11 @@ if_expression_predicate(predicate, ifThen, ifElse) ::= << >> set_enumeration(leftType, type, rightType, enums, isRelation) ::= << -/*set_enum <leftType>*/<if(isRelation)>BRelation<if(!enums)>::\<<if(!leftType)>Dummy, Dummy<else><leftType>, <rightType><endif>\><endif><else>BSet<if(!enums)>::\<<if(!type)>Dummy<else><type><endif>\><endif><endif>::new(vec![<enums; separator=", ">]) +/*set_enum <leftType>*/<if(isRelation)>BRelation<if(!enums)>::\<<if(!leftType)>Dummy, Dummy<else><leftType>, <rightType><endif>\><endif><else>BSet<if(!enums)>::\<<if(!type)>Dummy<else><type><endif>\><endif><endif>::new(vec![<if(isRelation)><enums; separator=", "><else><enums:{e | <e>.clone()}; separator=", "><endif>]) >> seq_enumeration(type, elements) ::= << -/*seq_enum <type>*/BRelation<if(!type)>::\<BInteger, Dummy><endif>::new(vec![<elements; separator=", ">]) +BRelation<if(!type)>::\<BInteger, Dummy><endif>::new(vec![<elements; separator=", ">]) >> enum_call(machine, class, identifier, isCurrentMachine) ::= << @@ -1103,6 +1113,7 @@ impl fmt::Display for <machine> { >> parameter_combination_predicate(otherIterationConstructs, set, element, emptyPredicate, predicate, subType) ::= << +//parameter_combination_predicate <otherIterationConstructs> <if(emptyPredicate)> <set> = <set>._union(&BSet::new(vec![<element>])); diff --git a/src/test/java/de/hhu/stups/codegenerator/rust/TestOthers.java b/src/test/java/de/hhu/stups/codegenerator/rust/TestOthers.java index a4cd83782ca072cd48dc372d4b87c04010ce034e..c2ebe21028fdcd59777ca2dad55c2dc81077bf82 100644 --- a/src/test/java/de/hhu/stups/codegenerator/rust/TestOthers.java +++ b/src/test/java/de/hhu/stups/codegenerator/rust/TestOthers.java @@ -68,4 +68,34 @@ public class TestOthers extends TestRS{ public void test_NatRangeLaws() throws Exception { testRSMC("NatRangeLaws", PROB_OTHER_PATH, false); } + + @Test + public void test_SetLaws() throws Exception { + testRSMC("SetLaws", PROB_OTHER_PATH, true); + } + + @Test + public void test_SetLawsNat() throws Exception { + testRSMC("SetLawsNat", PROB_OTHER_PATH, false); + } + + @Test + public void test_SetLawsPow() throws Exception { + testRSMC("SetLawsPow", PROB_OTHER_PATH, true); + } + + @Test + public void test_SetLawsPow2() throws Exception { + testRSMC("SetLawsPow2", PROB_OTHER_PATH, true); + } + + @Test + public void test_SetLawsPowPow() throws Exception { + testRSMC("SetLawsPowPow", PROB_OTHER_PATH, false); + } + + @Test + public void test_SetLawsPowPowCart() throws Exception { + testRSMC("SetLawsPowPowCart", PROB_OTHER_PATH, false); + } } diff --git a/src/test/resources/de/hhu/stups/codegenerator/SetLawsNat_MC.out b/src/test/resources/de/hhu/stups/codegenerator/SetLawsNat_MC.out new file mode 100644 index 0000000000000000000000000000000000000000..68b9681a21d32d03d4fc5e24034cb2cf4af9bf1a --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/SetLawsNat_MC.out @@ -0,0 +1,3 @@ +MODEL CHECKING SUCCESSFUL +Number of States: 4096 +Number of Transitions: 98304 \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/SetLawsPow2_MC.out b/src/test/resources/de/hhu/stups/codegenerator/SetLawsPow2_MC.out new file mode 100644 index 0000000000000000000000000000000000000000..9ac059c5f90b2e137eaa724e1d4550bc79b25539 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/SetLawsPow2_MC.out @@ -0,0 +1,3 @@ +MODEL CHECKING SUCCESSFUL +Number of States: 4096 +Number of Transitions: 36864 \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/SetLawsPow_MC.out b/src/test/resources/de/hhu/stups/codegenerator/SetLawsPow_MC.out new file mode 100644 index 0000000000000000000000000000000000000000..9ac059c5f90b2e137eaa724e1d4550bc79b25539 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/SetLawsPow_MC.out @@ -0,0 +1,3 @@ +MODEL CHECKING SUCCESSFUL +Number of States: 4096 +Number of Transitions: 36864 \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/SetLaws_MC.out b/src/test/resources/de/hhu/stups/codegenerator/SetLaws_MC.out new file mode 100644 index 0000000000000000000000000000000000000000..953622e10538fa9bec58c14b1461a9f7fa686c62 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/SetLaws_MC.out @@ -0,0 +1,3 @@ +MODEL CHECKING SUCCESSFUL +Number of States: 512 +Number of Transitions: 3840 \ No newline at end of file