ltlfilt: support --pi1 --sigma1 --delta1 --pi2 --sigma2
* bin/ltlfilt.cc: Implement those option. * tests/core/hierarchy.test: Add a quick test. * NEWS: Mention it.
This commit is contained in:
parent
7901a37747
commit
5bc4d12bba
3 changed files with 43 additions and 3 deletions
3
NEWS
3
NEWS
|
|
@ -6,6 +6,9 @@ New in spot 2.12.0.dev (not yet released)
|
||||||
edges leading to dead-ends. See the description of
|
edges leading to dead-ends. See the description of
|
||||||
restrict_dead_end_edges_here() below.
|
restrict_dead_end_edges_here() below.
|
||||||
|
|
||||||
|
- ltlfilt learned --pi1, --sigma1, --delta1, --pi2, --sigma2, and
|
||||||
|
--delta2 to filter according to classes Π₁,Σ₁,Δ₁,Π₂,Σ₂, and Δ₂.
|
||||||
|
|
||||||
Library:
|
Library:
|
||||||
|
|
||||||
- restrict_dead_end_edges_here() can reduce non-determinism (but
|
- restrict_dead_end_edges_here() can reduce non-determinism (but
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,8 @@ enum {
|
||||||
OPT_BSIZE_MAX,
|
OPT_BSIZE_MAX,
|
||||||
OPT_BSIZE_MIN,
|
OPT_BSIZE_MIN,
|
||||||
OPT_DEFINE,
|
OPT_DEFINE,
|
||||||
|
OPT_DELTA1,
|
||||||
|
OPT_DELTA2,
|
||||||
OPT_DROP_ERRORS,
|
OPT_DROP_ERRORS,
|
||||||
OPT_EQUIVALENT_TO,
|
OPT_EQUIVALENT_TO,
|
||||||
OPT_EXCLUSIVE_AP,
|
OPT_EXCLUSIVE_AP,
|
||||||
|
|
@ -89,6 +91,7 @@ enum {
|
||||||
OPT_NNF,
|
OPT_NNF,
|
||||||
OPT_OBLIGATION,
|
OPT_OBLIGATION,
|
||||||
OPT_PERSISTENCE,
|
OPT_PERSISTENCE,
|
||||||
|
OPT_PI2,
|
||||||
OPT_RECURRENCE,
|
OPT_RECURRENCE,
|
||||||
OPT_REJECT_WORD,
|
OPT_REJECT_WORD,
|
||||||
OPT_RELABEL,
|
OPT_RELABEL,
|
||||||
|
|
@ -97,6 +100,7 @@ enum {
|
||||||
OPT_REMOVE_WM,
|
OPT_REMOVE_WM,
|
||||||
OPT_REMOVE_X,
|
OPT_REMOVE_X,
|
||||||
OPT_SAFETY,
|
OPT_SAFETY,
|
||||||
|
OPT_SIGMA2,
|
||||||
OPT_SIZE,
|
OPT_SIZE,
|
||||||
OPT_SIZE_MAX,
|
OPT_SIZE_MAX,
|
||||||
OPT_SIZE_MIN,
|
OPT_SIZE_MIN,
|
||||||
|
|
@ -184,15 +188,22 @@ static const argp_option options[] =
|
||||||
{ "suspendable", OPT_SUSPENDABLE, nullptr, 0,
|
{ "suspendable", OPT_SUSPENDABLE, nullptr, 0,
|
||||||
"synonym for --universal --eventual", 0 },
|
"synonym for --universal --eventual", 0 },
|
||||||
{ "syntactic-safety", OPT_SYNTACTIC_SAFETY, nullptr, 0,
|
{ "syntactic-safety", OPT_SYNTACTIC_SAFETY, nullptr, 0,
|
||||||
"match syntactic-safety formulas", 0 },
|
"match syntactic-safety (a.k.a. Π₁) formulas", 0 },
|
||||||
|
{ "pi1", 0, nullptr, OPTION_ALIAS, nullptr, 0 },
|
||||||
{ "syntactic-guarantee", OPT_SYNTACTIC_GUARANTEE, nullptr, 0,
|
{ "syntactic-guarantee", OPT_SYNTACTIC_GUARANTEE, nullptr, 0,
|
||||||
"match syntactic-guarantee formulas", 0 },
|
"match syntactic-guarantee (a.k.a. Σ₁) formulas", 0 },
|
||||||
|
{ "sigma1", 0, nullptr, OPTION_ALIAS, nullptr, 0 },
|
||||||
{ "syntactic-obligation", OPT_SYNTACTIC_OBLIGATION, nullptr, 0,
|
{ "syntactic-obligation", OPT_SYNTACTIC_OBLIGATION, nullptr, 0,
|
||||||
"match syntactic-obligation formulas", 0 },
|
"match syntactic-obligation formulas", 0 },
|
||||||
|
{ "delta1", OPT_DELTA1, nullptr, 0,
|
||||||
|
"match Δ₁ formulas", 0 },
|
||||||
{ "syntactic-recurrence", OPT_SYNTACTIC_RECURRENCE, nullptr, 0,
|
{ "syntactic-recurrence", OPT_SYNTACTIC_RECURRENCE, nullptr, 0,
|
||||||
"match syntactic-recurrence formulas", 0 },
|
"match syntactic-recurrence formulas", 0 },
|
||||||
|
{ "pi2", OPT_PI2, nullptr, 0, "match Π₂ formulas", 0 },
|
||||||
{ "syntactic-persistence", OPT_SYNTACTIC_PERSISTENCE, nullptr, 0,
|
{ "syntactic-persistence", OPT_SYNTACTIC_PERSISTENCE, nullptr, 0,
|
||||||
"match syntactic-persistence formulas", 0 },
|
"match syntactic-persistence formulas", 0 },
|
||||||
|
{ "sigma2", OPT_SIGMA2, nullptr, 0, "match Σ₂ formulas", 0 },
|
||||||
|
{ "delta2", OPT_DELTA2, nullptr, 0, "match Δ₂ formulas", 0 },
|
||||||
{ "syntactic-stutter-invariant", OPT_SYNTACTIC_SI, nullptr, 0,
|
{ "syntactic-stutter-invariant", OPT_SYNTACTIC_SI, nullptr, 0,
|
||||||
"match stutter-invariant formulas syntactically (LTL-X or siPSL)", 0 },
|
"match stutter-invariant formulas syntactically (LTL-X or siPSL)", 0 },
|
||||||
{ "nox", 0, nullptr, OPTION_ALIAS, nullptr, 0 },
|
{ "nox", 0, nullptr, OPTION_ALIAS, nullptr, 0 },
|
||||||
|
|
@ -312,6 +323,10 @@ static bool syntactic_guarantee = false;
|
||||||
static bool syntactic_obligation = false;
|
static bool syntactic_obligation = false;
|
||||||
static bool syntactic_recurrence = false;
|
static bool syntactic_recurrence = false;
|
||||||
static bool syntactic_persistence = false;
|
static bool syntactic_persistence = false;
|
||||||
|
static bool delta1 = false;
|
||||||
|
static bool delta2 = false;
|
||||||
|
static bool sigma2 = false;
|
||||||
|
static bool pi2 = false;
|
||||||
static bool syntactic_si = false;
|
static bool syntactic_si = false;
|
||||||
static bool safety = false;
|
static bool safety = false;
|
||||||
static bool guarantee = false;
|
static bool guarantee = false;
|
||||||
|
|
@ -441,6 +456,12 @@ parse_opt(int key, char* arg, struct argp_state*)
|
||||||
case OPT_DEFINE:
|
case OPT_DEFINE:
|
||||||
opt->output_define.reset(new output_file(arg ? arg : "-"));
|
opt->output_define.reset(new output_file(arg ? arg : "-"));
|
||||||
break;
|
break;
|
||||||
|
case OPT_DELTA1:
|
||||||
|
delta1 = true;
|
||||||
|
break;
|
||||||
|
case OPT_DELTA2:
|
||||||
|
delta2 = true;
|
||||||
|
break;
|
||||||
case OPT_DROP_ERRORS:
|
case OPT_DROP_ERRORS:
|
||||||
error_style = drop_errors;
|
error_style = drop_errors;
|
||||||
break;
|
break;
|
||||||
|
|
@ -501,6 +522,9 @@ parse_opt(int key, char* arg, struct argp_state*)
|
||||||
case OPT_OBLIGATION:
|
case OPT_OBLIGATION:
|
||||||
obligation = true;
|
obligation = true;
|
||||||
break;
|
break;
|
||||||
|
case OPT_PI2:
|
||||||
|
pi2 = true;
|
||||||
|
break;
|
||||||
case OPT_PERSISTENCE:
|
case OPT_PERSISTENCE:
|
||||||
persistence = true;
|
persistence = true;
|
||||||
break;
|
break;
|
||||||
|
|
@ -564,6 +588,9 @@ parse_opt(int key, char* arg, struct argp_state*)
|
||||||
case OPT_AP_N:
|
case OPT_AP_N:
|
||||||
ap_n = parse_range(arg, 0, std::numeric_limits<int>::max());
|
ap_n = parse_range(arg, 0, std::numeric_limits<int>::max());
|
||||||
break;
|
break;
|
||||||
|
case OPT_SIGMA2:
|
||||||
|
sigma2 = true;
|
||||||
|
break;
|
||||||
case OPT_SUSPENDABLE:
|
case OPT_SUSPENDABLE:
|
||||||
universal = true;
|
universal = true;
|
||||||
eventual = true;
|
eventual = true;
|
||||||
|
|
@ -745,8 +772,12 @@ namespace
|
||||||
matched &= !syntactic_safety || f.is_syntactic_safety();
|
matched &= !syntactic_safety || f.is_syntactic_safety();
|
||||||
matched &= !syntactic_guarantee || f.is_syntactic_guarantee();
|
matched &= !syntactic_guarantee || f.is_syntactic_guarantee();
|
||||||
matched &= !syntactic_obligation || f.is_syntactic_obligation();
|
matched &= !syntactic_obligation || f.is_syntactic_obligation();
|
||||||
|
matched &= !delta1 || f.is_delta1();
|
||||||
matched &= !syntactic_recurrence || f.is_syntactic_recurrence();
|
matched &= !syntactic_recurrence || f.is_syntactic_recurrence();
|
||||||
|
matched &= !pi2 || f.is_pi2();
|
||||||
matched &= !syntactic_persistence || f.is_syntactic_persistence();
|
matched &= !syntactic_persistence || f.is_syntactic_persistence();
|
||||||
|
matched &= !sigma2 || f.is_sigma2();
|
||||||
|
matched &= !delta2 || f.is_delta2();
|
||||||
matched &= !syntactic_si || f.is_syntactic_stutter_invariant();
|
matched &= !syntactic_si || f.is_syntactic_stutter_invariant();
|
||||||
if (matched && (ap_n.min > 0 || ap_n.max >= 0))
|
if (matched && (ap_n.min > 0 || ap_n.max >= 0))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -21,16 +21,22 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
test 11 -eq `genltl --dac | ltlfilt --pi1 -c`
|
||||||
test 11 -eq `genltl --dac | ltlfilt --syntactic-safety -c`
|
test 11 -eq `genltl --dac | ltlfilt --syntactic-safety -c`
|
||||||
test 37 -eq `genltl --dac | ltlfilt --safety -c`
|
test 37 -eq `genltl --dac | ltlfilt --safety -c`
|
||||||
test 'Fp0' = `genltl --dac | ltlfilt --syntactic-guarantee`
|
test 'Fp0' = `genltl --dac | ltlfilt --syntactic-guarantee`
|
||||||
test 'Fp0' = `genltl --dac | ltlfilt --guarantee`
|
test 'Fp0' = `genltl --dac | ltlfilt --guarantee`
|
||||||
|
test 'Fp0' = `genltl --dac | ltlfilt --sigma1`
|
||||||
|
test 23 -eq `genltl --dac | ltlfilt --delta1 -c`
|
||||||
test 25 -eq `genltl --dac | ltlfilt --syntactic-obligation -c`
|
test 25 -eq `genltl --dac | ltlfilt --syntactic-obligation -c`
|
||||||
test 40 -eq `genltl --dac | ltlfilt --obligation -c`
|
test 40 -eq `genltl --dac | ltlfilt --obligation -c`
|
||||||
|
test 42 -eq `genltl --dac | ltlfilt --pi2 -c`
|
||||||
test 47 -eq `genltl --dac | ltlfilt --syntactic-recurrence -c`
|
test 47 -eq `genltl --dac | ltlfilt --syntactic-recurrence -c`
|
||||||
test 52 -eq `genltl --dac | ltlfilt --recurrence -c`
|
test 52 -eq `genltl --dac | ltlfilt --recurrence -c`
|
||||||
|
test 29 -eq `genltl --dac | ltlfilt --sigma2 -c`
|
||||||
test 29 -eq `genltl --dac | ltlfilt --syntactic-persistence -c`
|
test 29 -eq `genltl --dac | ltlfilt --syntactic-persistence -c`
|
||||||
test 41 -eq `genltl --dac | ltlfilt --persistence -c`
|
test 41 -eq `genltl --dac | ltlfilt --persistence -c`
|
||||||
|
test 48 -eq `genltl --dac | ltlfilt --delta2 -c`
|
||||||
test 'G!p0 | F(p0 & (!p1 W p2))' = "`genltl --dac |
|
test 'G!p0 | F(p0 & (!p1 W p2))' = "`genltl --dac |
|
||||||
ltlfilt -v --obligation | ltlfilt --persistence`"
|
ltlfilt -v --obligation | ltlfilt --persistence`"
|
||||||
test 12 -eq `genltl --dac |
|
test 12 -eq `genltl --dac |
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue