bugfix for F and G encodings -- missing element for i=k

This commit is contained in:
Artur Meski
2017-03-12 12:50:09 +01:00
parent fab7880ccf
commit 20464ac6dd
4 changed files with 82 additions and 35 deletions

View File

@@ -93,7 +93,7 @@ class rsLTL_Encoder(object):
else:
# level == bound
enc = False
for loop_level in range(1, bound):
for loop_level in range(1, bound+1):
enc = Or(enc, And(self.loop_position == loop_level,
self.encode(formula.left_operand, loop_level, bound)))
enc = And(enc, self.encode_bag_ctx(formula.sub_operand, level))
@@ -110,13 +110,20 @@ class rsLTL_Encoder(object):
)
else:
# level == bound
enc = False
for loop_level in range(1, bound):
enc = Or(enc, And(self.loop_position == loop_level),
self.encode_approx(formula, loop_level, bound),
enc_loops = False
for loop_level in range(1, bound+1):
enc_loops = Or(enc,
And(
self.loop_position == loop_level,
self.encode_approx(formula, loop_level, bound),
)
)
enc = And(enc, self.encode_bag_ctx(formula.sub_operand, level))
enc = simplify(enc)
enc = And(
self.encode(formula.left_operand, bound, bound),
enc_loops,
self.encode_bag_ctx(formula.sub_operand, level)
)
enc = simplify(enc)
return enc
@@ -131,14 +138,22 @@ class rsLTL_Encoder(object):
)
else:
# level == bound
enc = False
for loop_level in range(1, bound):
enc = Or(enc,
enc_loops = False
for loop_level in range(1, bound+1):
enc_loops = Or(enc_loops,
And(
self.loop_position == loop_level),
self.loop_position == loop_level,
self.encode_approx(formula, loop_level, bound),
)
)
enc = And(enc, self.encode_bag_ctx(formula.sub_operand, level))
#print(enc)
enc = Or(self.encode(formula.left_operand, bound, bound),
And(
enc_loops,
self.encode_bag_ctx(formula.sub_operand, level)
)
)
enc = simplify(enc)
return enc
@@ -149,7 +164,7 @@ class rsLTL_Encoder(object):
else:
# level == bound
inner_enc = False
for loop_level in range(1, bound):
for loop_level in range(1, bound+1):
inner_enc = Or(inner_enc,
And(
self.loop_position == loop_level,
@@ -174,7 +189,7 @@ class rsLTL_Encoder(object):
else:
# level == bound
inner_enc = False
for loop_level in range(1, bound):
for loop_level in range(1, bound+1):
inner_enc = Or(inner_enc,
And(
self.loop_position == loop_level,
@@ -193,7 +208,6 @@ class rsLTL_Encoder(object):
)
)
return enc
else:
@@ -238,6 +252,35 @@ class rsLTL_Encoder(object):
return enc
elif formula.f_type == rsLTL_form_type.t_globally:
if level < bound:
enc = And(
self.encode(formula.left_operand, level, bound),
self.encode_bag_ctx(formula.sub_operand, level),
self.encode_approx(formula, level + 1, bound)
)
else:
# level == bound
enc = self.encode(formula.left_operand, bound, bound)
return enc
elif formula.f_type == rsLTL_form_type.t_finally:
if level < bound:
enc = Or(
self.encode(formula.left_operand, level, bound),
And(
self.encode_bag_ctx(formula.sub_operand, level),
self.encode_approx(formula, level + 1, bound)
)
)
else:
# level == bound
enc = self.encode(formula.left_operand, bound, bound)
return enc
else:
raise NotImplementedError("Unsupported operator in approximation encoding")