From 1c2a7f3d4f7da0b45e5378071c519906ffc834de Mon Sep 17 00:00:00 2001 From: Alexandre Duret-Lutz Date: Wed, 22 Mar 2017 07:57:38 +0100 Subject: [PATCH] genltl: add --hkrss-patterns Fixes #245. * bin/genltl.cc: Add the option. * bin/man/genltl.x: Add reference. * tests/core/ltl2tgba2.test: Use these patterns. * doc/org/genltl.org, NEWS: Document the options. --- NEWS | 4 +- bin/genltl.cc | 94 +++++++++++++ bin/man/genltl.x | 46 ++++--- doc/org/genltl.org | 271 ++++++++++++++++++++++++-------------- tests/core/ltl2tgba2.test | 117 +++++++++++++++- 5 files changed, 404 insertions(+), 128 deletions(-) diff --git a/NEWS b/NEWS index 2984aa81f..8fb613a45 100644 --- a/NEWS +++ b/NEWS @@ -5,7 +5,9 @@ New in spot 2.3.2.dev (not yet released) - In autfilt, the options --sum(--sum-or) and --sum-and are implemented. - - genltl learned --spec-patterns as an alias for --dac-patterns + - genltl learned --spec-patterns as an alias for --dac-patterns; it + also learned a new set of LTL formulas under --hkrss-patterns + (a.k.a. --liberouter-patterns). Library: diff --git a/bin/genltl.cc b/bin/genltl.cc index b517e4c3d..9d39d894a 100644 --- a/bin/genltl.cc +++ b/bin/genltl.cc @@ -132,6 +132,16 @@ // month = nov, // publisher = {Springer} // } +// +// @techreport{holevek.04.tr, +// title = {Verification Results in {Liberouter} Project}, +// author = {J. Hole\v{c}ek and T. Kratochv\'ila and V. \v{R}eh\'ak +// and D. \v{S}afr\'anek and P. \v{S}ime\v{c}ek}, +// month = {September}, +// year = 2004, +// number = 03, +// institution = {CESNET} +// } #include "common_sys.hh" @@ -179,6 +189,7 @@ enum { OPT_GH_Q, OPT_GH_R, OPT_GO_THETA, + OPT_HKRSS_PATTERNS, OPT_KR_N, OPT_KR_NLOGN, OPT_KV_PSI, @@ -217,6 +228,7 @@ const char* const class_name[LAST_CLASS - FIRST_CLASS] = "gh-q", "gh-r", "go-theta", + "hkrss-patterns", "kr-n", "kr-nlogn", "kv-psi", @@ -274,6 +286,10 @@ static const argp_option options[] = "(GF(p1)|FG(p2))&(GF(p2)|FG(p3))&... &(GF(pn)|FG(p{n+1}))", 0 }, { "go-theta", OPT_GO_THETA, "RANGE", 0, "!((GF(p1)&GF(p2)&...&GF(pn)) -> G(q->F(r)))", 0 }, + { "hkrss-patterns", OPT_HKRSS_PATTERNS, "RANGE", OPTION_ARG_OPTIONAL, + "Holeček et al. patterns from the Liberouter project " + "(range should be included in 1..55)", 0 }, + OPT_ALIAS(liberouter-patterns), { "kr-n", OPT_KR_N, "RANGE", 0, "linear formula with doubly exponential DBA", 0 }, { "kr-nlogn", OPT_KR_NLOGN, "RANGE", 0, @@ -408,6 +424,7 @@ parse_opt(int key, char* arg, struct argp_state*) enqueue_job(key, arg); break; case OPT_DAC_PATTERNS: + case OPT_HKRSS_PATTERNS: if (arg) enqueue_job(key, arg); else @@ -1027,6 +1044,80 @@ dac_pattern(int n) return spot::relabel(parse_formula(formulas[n - 1]), Pnn); } +static formula +hkrss_pattern(int n) +{ + static const char* formulas[] = { + "G(Fp0 & F!p0)", + "GFp0 & GF!p0", + "GF(!(p1 <-> Xp1) | !(p0 <-> Xp0))", + "GF(!(p1 <-> Xp1) | !(p0 <-> Xp0) | !(p2 <-> Xp2) | !(p3 <-> Xp3))", + "G!p0", + "G((p0 -> F!p0) & (!p0 -> Fp0))", + "G(p0 -> F(p0 & p1))", + "G(p0 -> F((!p0 & p1 & p2 & p3) -> Fp4))", + "G(p0 -> F!p1)", + "G(p0 -> Fp1)", + "G(p0 -> F(p1 -> Fp2))", + "G(p0 -> F((p1 & p2) -> Fp3))", + "G((p0 -> Fp1) & (p2 -> Fp3) & (p4 -> Fp5) & (p6 -> Fp7))", + "G(!p0 & !p1)", + "G!(p0 & p1)", + "G(p0 -> p1)", + "G((p0 -> !p1) & (p1 -> !p0))", + "G(!p0 -> (p1 <-> !p2))", + "G((!p0 & (p1 | p2 | p3)) -> p4)", + "G((p0 & p1) -> (p2 | !(p3 & p4)))", + "G((!p0 & p1 & !p2 & !p3 & !p4) -> F(!p5 & !p6 & !p7 & !p8))", + "G((p0 & p1 & !p2 & !p3 & !p4) -> F(p5 & !p6 & !p7 & !p8))", + "G(!p0 -> !(p1 & p2 & p3 & p4 & p5))", + "G(!p0 -> ((p1 & p2 & p3 & p4) -> !p5))", + "G((p0 & p1) -> (p2 | p3 | !(p4 & p5)))", + "G((!p0 & (p1 | p2 | p3 | p4)) -> (!p5 <-> p6))", + "G((p0 & p1) -> (p2 | p3 | p4 | !(p5 & p6)))", + "G((p0 & p1) -> (p2 | p3 | p4 | p5 | !(p6 & p7)))", + "G((p0 & p1 & !p2 & Xp2) -> X(p3 | X(!p1 | p3)))", + "G((p0 & p1 & !p2 & Xp2) -> X(X!p1 | (p2 U (!p2 U (p2 U (!p1 | p3))))))", + "G(p0 & p1 & !p2 & Xp2) -> X(X!p1 | (p2 U (!p2 U (p2 U (!p1 | p3)))))", + "G(p0 -> (p1 U (!p1 U (!p2 | p3))))", + "G(p0 -> (p1 U (!p1 U (p2 | p3))))", + "G((!p0 & p1) -> Xp2)", + "G(p0 -> X(p0 | p1))", + ("G((!(p1 <-> Xp1) | !(p0 <-> Xp0) | !(p2 <-> Xp2) | !(p3 <-> Xp3)) -> " + "(X!p4 & X(!(!(p1 <-> Xp1) | !(p0 <-> Xp0) | !(p2 <-> Xp2) | " + "!(p3 <-> Xp3)) U p4)))"), + "G((p0 & !p1 & Xp1 & Xp0) -> (p2 -> Xp3))", + "G(p0 -> X(!p0 U p1))", + "G((!p0 & Xp0) -> X((p0 U p1) | Gp0))", + "G((!p0 & Xp0) -> X(p0 U (p0 & !p1 & X(p0 & p1))))", + ("G((!p0 & Xp0) -> X(p0 U (p0 & !p1 & X(p0 & p1 & (p0 U (p0 & !p1 & " + "X(p0 & p1)))))))"), + ("G((p0 & X!p0) -> X(!p0 U (!p0 & !p1 & X(!p0 & p1 & (!p0 U (!p0 & !p1 " + "& X(!p0 & p1)))))))"), + ("G((p0 & X!p0) -> X(!p0 U (!p0 & !p1 & X(!p0 & p1 & (!p0 U (!p0 & !p1 & " + "X(!p0 & p1 & (!p0 U (!p0 & !p1 & X(!p0 & p1))))))))))"), + "G((!p0 & Xp0) -> X(!(!p0 & Xp0) U (!p1 & Xp1)))", + ("G(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | " + "X(!p0 | X(!p0 | X!p0)))))))))))"), + "G((Xp0 -> p0) -> (p1 <-> Xp1))", + "G((Xp0 -> p0) -> ((p1 -> Xp1) & (!p1 -> X!p1)))", + ("!p0 U G!((p1 & p2) | (p3 & p4) | (p2 & p3) | (p2 & p4) | (p1 & p4) | " + "(p1 & p3))"), + "!p0 U p1", + "(p0 U p1) | Gp0", + "p0 & XG!p0", + "XG(p0 -> (G!p1 | (!Xp1 U p2)))", + "XG((p0 & !p1) -> (G!p1 | (!p1 U p2)))", + "XG((p0 & p1) -> ((p1 U p2) | Gp1))", + "Xp0 & G((!p0 & Xp0) -> XXp0)", + }; + + constexpr unsigned max = (sizeof formulas)/(sizeof *formulas); + if (n < 1 || (unsigned) n > max) + bad_number("--hkrss-patterns", n, max); + return spot::relabel(parse_formula(formulas[n - 1]), Pnn); +} + static formula eh_pattern(int n) { @@ -1376,6 +1467,9 @@ output_pattern(int pattern, int n) case OPT_GO_THETA: f = fair_response("p", "q", "r", n); break; + case OPT_HKRSS_PATTERNS: + f = hkrss_pattern(n); + break; case OPT_KR_N: f = kr2_exp(n, "a", "b", "c", "d"); break; diff --git a/bin/man/genltl.x b/bin/man/genltl.x index 6272f4ac2..b9f224a71 100644 --- a/bin/man/genltl.x +++ b/bin/man/genltl.x @@ -12,22 +12,10 @@ Proceedings of ATVA'13. LNCS 8172. .PP Prefixes used in pattern names refer to the following papers: .TP -gh -J. Geldenhuys and H. Hansen: Larger automata and less -work for LTL model checking. Proceedings of Spin'06. LNCS 3925. -.TP ccj J. Cichoń, A. Czubak, and A. Jasiński: Minimal Büchi Automata for Certain Classes of LTL Formulas. Proceedings of DepCoS'09. .TP -go -P. Gastin and D. Oddoux: Fast LTL to Büchi Automata Translation. -Proceedings of CAV'01. LNCS 2102. -.TP -rv -K. Rozier and M. Vardi: LTL Satisfiability Checking. -Proceedings of Spin'07. LNCS 4595. -.TP dac M. B. Dwyer and G. S. Avrunin and J. C. Corbett: Property Specification Patterns for Finite-state Verification. @@ -37,6 +25,31 @@ eh K. Etessami and G. J. Holzmann: Optimizing Büchi Automata. Proceedings of Concur'00. LNCS 1877. .TP +gh +J. Geldenhuys and H. Hansen: Larger automata and less +work for LTL model checking. Proceedings of Spin'06. LNCS 3925. +.TP +hkrss +J. Holeček, T. Kratochvila, V. Řehák, D. Šafránek, and P. Šimeček: +Verification Results in Liberouter Project. Tech. Report 03, CESNET, 2004. +.TP +go +P. Gastin and D. Oddoux: Fast LTL to Büchi Automata Translation. +Proceedings of CAV'01. LNCS 2102. +.TP +kr +O. Kupferman and A. Rosenberg: The Blow-Up in Translating LTL to Deterministic +Automata. +Proceedings of MoChArt'10. LNAI 6572. +.TP +kv +O. Kupferman and M. Y. Vardi: From Linear Time to Branching Time. +ACM Transactions on Computational Logic, 6(2):273-294, 2005. +.TP +rv +K. Rozier and M. Vardi: LTL Satisfiability Checking. +Proceedings of Spin'07. LNCS 4595. +.TP sb F. Somenzi and R. Bloem: Efficient Büchi Automata for LTL Formulae. Proceedings of CAV'00. LNCS 1855. @@ -44,15 +57,6 @@ Proceedings of CAV'00. LNCS 1855. tv D. Tabakov and M. Y. Vardi: Optimized Temporal Monitors for SystemC. Proceedings of RV'10. LNCS 6418. -.TP -kr -O. Kupferman and A. Rosenberg: The Blow-Up in Translating LTL to Deterministic -Automata. -Proceedings of MoChArt'10. LNAI 6572. -.TP -rv -O. Kupferman and M. Y. Vardi: From Linear Time to Branching Time. -ACM Transactions on Computational Logic, 6(2):273-294, 2005. [SEE ALSO] .BR randltl (1) diff --git a/doc/org/genltl.org b/doc/org/genltl.org index 3751df185..963b0156a 100644 --- a/doc/org/genltl.org +++ b/doc/org/genltl.org @@ -27,14 +27,22 @@ genltl --help | sed -n '/Pattern selection:/,/^$/p' | sed '1d;$d' --ccj-beta=RANGE F(p&X(p&X(p&...X(p)))) & F(q&X(q&X(q&...X(q)))) --ccj-beta-prime=RANGE F(p&(Xp)&(XXp)&...(X...X(p))) & F(q&(Xq)&(XXq)&...(X...X(q))) - --dac-patterns[=RANGE] Dwyer et al. [FMSP'98] Spec. Patterns for LTL - (range should be included in 1..45) + --dac-patterns[=RANGE], --spec-patterns[=RANGE] + Dwyer et al. [FMSP'98] Spec. Patterns for LTL + (range should be included in 1..55) --eh-patterns[=RANGE] Etessami and Holzmann [Concur'00] patterns (range should be included in 1..12) --gh-q=RANGE (F(p1)|G(p2))&(F(p2)|G(p3))&...&(F(pn)|G(p{n+1})) --gh-r=RANGE (GF(p1)|FG(p2))&(GF(p2)|FG(p3))&... &(GF(pn)|FG(p{n+1})) --go-theta=RANGE !((GF(p1)&GF(p2)&...&GF(pn)) -> G(q->F(r))) + --hkrss-patterns[=RANGE], --liberouter-patterns[=RANGE] + Holeček et al. patterns from the Liberouter + project (range should be included in 1..55) + --kr-n=RANGE linear formula with doubly exponential DBA + --kr-nlogn=RANGE quasilinear formula with doubly exponential DBA + --kv-psi=RANGE, --kr-n2=RANGE + quadratic formula with doubly exponential DBA --or-fg=RANGE, --ccj-xi=RANGE FG(p1)|FG(p2)|...|FG(pn) --or-g=RANGE, --gh-s=RANGE G(p1)|G(p2)|...|G(pn) @@ -49,6 +57,11 @@ genltl --help | sed -n '/Pattern selection:/,/^$/p' | sed '1d;$d' --rv-counter-linear=RANGE n-bit counter (linear size) --sb-patterns[=RANGE] Somenzi and Bloem [CAV'00] patterns (range should be included in 1..27) + --tv-f1=RANGE G(p -> (q | Xq | ... | XX...Xq) + --tv-f2=RANGE G(p -> (q | X(q | X(... | Xq))) + --tv-g1=RANGE G(p -> (q & Xq & ... & XX...Xq) + --tv-g2=RANGE G(p -> (q & X(q & X(... & Xq))) + --tv-uu=RANGE G(p1 -> (p1 U (p2 & (p2 U (p3 & (p3 U ...)))))) --u-left=RANGE, --gh-u=RANGE (((p1 U p2) U p3) ... U pn) --u-right=RANGE, --gh-u2=RANGE, --go-phi=RANGE @@ -120,112 +133,168 @@ This is because most tools using =lbt='s syntax require atomic propositions to have the form =pNN=. -Three options provide lists of unrelated LTL formulas, taken from the +Four options provide lists of unrelated LTL formulas, taken from the literature (see the [[./man/genltl.1.html][=genltl=]](1) man page for references): -=--dac-patterns=, =--eh-patterns=, and =--sb-patterns=. With these -options, the range is used to select a subset of the list of formulas. -Without range, all formulas are used. Here is the complete list: +=--dac-patterns=, =--eh-patterns=, =--hkrss-patterns=, and +=--sb-patterns=. With these options, the range is used to select a +subset of the list of formulas. Without range, all formulas are used. +Here is the complete list: #+BEGIN_SRC sh :results verbatim :exports both - genltl --dac --eh --sb --format=%F,%L,%f + genltl --dac --eh --hkrss --sb --format=%F:%L,%f #+END_SRC #+RESULTS: #+begin_example -dac-patterns,1,G!p0 -dac-patterns,2,Fp0 -> (!p1 U p0) -dac-patterns,3,G(p0 -> G!p1) -dac-patterns,4,G((p0 & !p1 & Fp1) -> (!p2 U p1)) -dac-patterns,5,G((p0 & !p1) -> (!p2 W p1)) -dac-patterns,6,Fp0 -dac-patterns,7,!p0 W (!p0 & p1) -dac-patterns,8,G!p0 | F(p0 & Fp1) -dac-patterns,9,G((p0 & !p1) -> (!p1 W (!p1 & p2))) -dac-patterns,10,G((p0 & !p1) -> (!p1 U (!p1 & p2))) -dac-patterns,11,!p0 W (p0 W (!p0 W (p0 W G!p0))) -dac-patterns,12,Fp0 -> ((!p0 & !p1) U (p0 | ((!p0 & p1) U (p0 | ((!p0 & !p1) U (p0 | ((!p0 & p1) U (p0 | (!p1 U p0))))))))) -dac-patterns,13,Fp0 -> (!p0 U (p0 & (!p1 W (p1 W (!p1 W (p1 W G!p1)))))) -dac-patterns,14,G((p0 & Fp1) -> ((!p1 & !p2) U (p1 | ((!p1 & p2) U (p1 | ((!p1 & !p2) U (p1 | ((!p1 & p2) U (p1 | (!p2 U p1)))))))))) -dac-patterns,15,G(p0 -> ((!p1 & !p2) U (p2 | ((p1 & !p2) U (p2 | ((!p1 & !p2) U (p2 | ((p1 & !p2) U (p2 | (!p1 W p2) | Gp1))))))))) -dac-patterns,16,Gp0 -dac-patterns,17,Fp0 -> (p1 U p0) -dac-patterns,18,G(p0 -> Gp1) -dac-patterns,19,G((p0 & !p1 & Fp1) -> (p2 U p1)) -dac-patterns,20,G((p0 & !p1) -> (p2 W p1)) -dac-patterns,21,!p0 W p1 -dac-patterns,22,Fp0 -> (!p1 U (p0 | p2)) -dac-patterns,23,G!p0 | F(p0 & (!p1 W p2)) -dac-patterns,24,G((p0 & !p1 & Fp1) -> (!p2 U (p1 | p3))) -dac-patterns,25,G((p0 & !p1) -> (!p2 W (p1 | p3))) -dac-patterns,26,G(p0 -> Fp1) -dac-patterns,27,Fp0 -> ((p1 -> (!p0 U (!p0 & p2))) U p0) -dac-patterns,28,G(p0 -> G(p1 -> Fp2)) -dac-patterns,29,G((p0 & !p1 & Fp1) -> ((p2 -> (!p1 U (!p1 & p3))) U p1)) -dac-patterns,30,G((p0 & !p1) -> ((p2 -> (!p1 U (!p1 & p3))) W p1)) -dac-patterns,31,Fp0 -> (!p0 U (!p0 & p1 & X(!p0 U p2))) -dac-patterns,32,Fp0 -> (!p1 U (p0 | (!p1 & p2 & X(!p1 U p3)))) -dac-patterns,33,G!p0 | (!p0 U ((p0 & Fp1) -> (!p1 U (!p1 & p2 & X(!p1 U p3))))) -dac-patterns,34,G((p0 & Fp1) -> (!p2 U (p1 | (!p2 & p3 & X(!p2 U p4))))) -dac-patterns,35,G(p0 -> (Fp1 -> (!p1 U (p2 | (!p1 & p3 & X(!p1 U p4)))))) -dac-patterns,36,F(p0 & XFp1) -> (!p0 U p2) -dac-patterns,37,Fp0 -> (!(!p0 & p1 & X(!p0 U (!p0 & p2))) U (p0 | p3)) -dac-patterns,38,G!p0 | (!p0 U (p0 & (F(p1 & XFp2) -> (!p1 U p3)))) -dac-patterns,39,G((p0 & Fp1) -> (!(!p1 & p2 & X(!p1 U (!p1 & p3))) U (p1 | p4))) -dac-patterns,40,G(p0 -> ((!(!p1 & p2 & X(!p1 U (!p1 & p3))) U (p1 | p4)) | G!(p2 & XFp3))) -dac-patterns,41,G((p0 & XFp1) -> XF(p1 & Fp2)) -dac-patterns,42,Fp0 -> (((p1 & X(!p0 U p2)) -> X(!p0 U (p2 & Fp3))) U p0) -dac-patterns,43,G(p0 -> G((p1 & XFp2) -> X(!p2 U (p2 & Fp3)))) -dac-patterns,44,G((p0 & Fp1) -> (((p2 & X(!p1 U p3)) -> X(!p1 U (p3 & Fp4))) U p1)) -dac-patterns,45,G(p0 -> (((p1 & X(!p2 U p3)) -> X(!p2 U (p3 & Fp4))) U (p2 | G((p1 & X(!p2 U p3)) -> X(!p2 U (p3 & Fp4)))))) -dac-patterns,46,G(p0 -> F(p1 & XFp2)) -dac-patterns,47,Fp0 -> ((p1 -> (!p0 U (!p0 & p2 & X(!p0 U p3)))) U p0) -dac-patterns,48,G(p0 -> G(p1 -> (p2 & XFp3))) -dac-patterns,49,G((p0 & Fp1) -> ((p2 -> (!p1 U (!p1 & p3 & X(!p1 U p4)))) U p1)) -dac-patterns,50,G(p0 -> ((p1 -> (!p2 U (!p2 & p3 & X(!p2 U p4)))) U (p2 | G(p1 -> (p3 & XFp4))))) -dac-patterns,51,G(p0 -> F(p1 & !p2 & X(!p2 U p3))) -dac-patterns,52,Fp0 -> ((p1 -> (!p0 U (!p0 & p2 & !p3 & X((!p0 & !p3) U p4)))) U p0) -dac-patterns,53,G(p0 -> G(p1 -> (p2 & !p3 & X(!p3 U p4)))) -dac-patterns,54,G((p0 & Fp1) -> ((p2 -> (!p1 U (!p1 & p3 & !p4 & X((!p1 & !p4) U p5)))) U p1)) -dac-patterns,55,G(p0 -> ((p1 -> (!p2 U (!p2 & p3 & !p4 & X((!p2 & !p4) U p5)))) U (p2 | G(p1 -> (p3 & !p4 & X(!p4 U p5)))))) -eh-patterns,1,p0 U (p1 & Gp2) -eh-patterns,2,p0 U (p1 & X(p2 U p3)) -eh-patterns,3,p0 U (p1 & X(p2 & F(p3 & XF(p4 & XF(p5 & XFp6))))) -eh-patterns,4,F(p0 & XGp1) -eh-patterns,5,F(p0 & X(p1 & XFp2)) -eh-patterns,6,F(p0 & X(p1 U p2)) -eh-patterns,7,FGp0 | GFp1 -eh-patterns,8,G(p0 -> (p1 U p2)) -eh-patterns,9,G(p0 & XF(p1 & XF(p2 & XFp3))) -eh-patterns,10,GFp0 & GFp1 & GFp2 & GFp3 & GFp4 -eh-patterns,11,(p0 U (p1 U p2)) | (p1 U (p2 U p0)) | (p2 U (p0 U p1)) -eh-patterns,12,G(p0 -> (p1 U (Gp2 | Gp3))) -sb-patterns,1,p0 U p1 -sb-patterns,2,p0 U (p1 U p2) -sb-patterns,3,!(p0 U (p1 U p2)) -sb-patterns,4,GFp0 -> GFp1 -sb-patterns,5,Fp0 U Gp1 -sb-patterns,6,Gp0 U p1 -sb-patterns,7,!(Fp0 <-> Fp1) -sb-patterns,8,!(GFp0 -> GFp1) -sb-patterns,9,!(GFp0 <-> GFp1) -sb-patterns,10,p0 R (p0 | p1) -sb-patterns,11,(Xp0 U Xp1) | !X(p0 U p1) -sb-patterns,12,(Xp0 U p1) | !X(p0 U (p0 & p1)) -sb-patterns,13,G(p0 -> Fp1) & ((Xp0 U p1) | !X(p0 U (p0 & p1))) -sb-patterns,14,G(p0 -> Fp1) & ((Xp0 U Xp1) | !X(p0 U p1)) -sb-patterns,15,G(p0 -> Fp1) -sb-patterns,16,!G(p0 -> X(p1 R p2)) -sb-patterns,17,!(FGp0 | FGp1) -sb-patterns,18,G(Fp0 & Fp1) -sb-patterns,19,Fp0 & F!p0 -sb-patterns,20,(p0 & Xp1) R X(((p2 U p3) R p0) U (p2 R p0)) -sb-patterns,21,Gp2 | (G(p0 | GFp1) & G(p2 | GF!p1)) | Gp0 -sb-patterns,22,Gp0 | Gp2 | (G(p0 | FGp1) & G(p2 | FG!p1)) -sb-patterns,23,!(Gp2 | (G(p0 | GFp1) & G(p2 | GF!p1)) | Gp0) -sb-patterns,24,!(Gp0 | Gp2 | (G(p0 | FGp1) & G(p2 | FG!p1))) -sb-patterns,25,G(p0 | XGp1) & G(p2 | XG!p1) -sb-patterns,26,G(p0 | (Xp1 & X!p1)) -sb-patterns,27,p0 | (p1 U p0) +dac-patterns:1,G!p0 +dac-patterns:2,Fp0 -> (!p1 U p0) +dac-patterns:3,G(p0 -> G!p1) +dac-patterns:4,G((p0 & !p1 & Fp1) -> (!p2 U p1)) +dac-patterns:5,G((p0 & !p1) -> (!p2 W p1)) +dac-patterns:6,Fp0 +dac-patterns:7,!p0 W (!p0 & p1) +dac-patterns:8,G!p0 | F(p0 & Fp1) +dac-patterns:9,G((p0 & !p1) -> (!p1 W (!p1 & p2))) +dac-patterns:10,G((p0 & !p1) -> (!p1 U (!p1 & p2))) +dac-patterns:11,!p0 W (p0 W (!p0 W (p0 W G!p0))) +dac-patterns:12,Fp0 -> ((!p0 & !p1) U (p0 | ((!p0 & p1) U (p0 | ((!p0 & !p1) U (p0 | ((!p0 & p1) U (p0 | (!p1 U p0))))))))) +dac-patterns:13,Fp0 -> (!p0 U (p0 & (!p1 W (p1 W (!p1 W (p1 W G!p1)))))) +dac-patterns:14,G((p0 & Fp1) -> ((!p1 & !p2) U (p1 | ((!p1 & p2) U (p1 | ((!p1 & !p2) U (p1 | ((!p1 & p2) U (p1 | (!p2 U p1)))))))))) +dac-patterns:15,G(p0 -> ((!p1 & !p2) U (p2 | ((p1 & !p2) U (p2 | ((!p1 & !p2) U (p2 | ((p1 & !p2) U (p2 | (!p1 W p2) | Gp1))))))))) +dac-patterns:16,Gp0 +dac-patterns:17,Fp0 -> (p1 U p0) +dac-patterns:18,G(p0 -> Gp1) +dac-patterns:19,G((p0 & !p1 & Fp1) -> (p2 U p1)) +dac-patterns:20,G((p0 & !p1) -> (p2 W p1)) +dac-patterns:21,!p0 W p1 +dac-patterns:22,Fp0 -> (!p1 U (p0 | p2)) +dac-patterns:23,G!p0 | F(p0 & (!p1 W p2)) +dac-patterns:24,G((p0 & !p1 & Fp1) -> (!p2 U (p1 | p3))) +dac-patterns:25,G((p0 & !p1) -> (!p2 W (p1 | p3))) +dac-patterns:26,G(p0 -> Fp1) +dac-patterns:27,Fp0 -> ((p1 -> (!p0 U (!p0 & p2))) U p0) +dac-patterns:28,G(p0 -> G(p1 -> Fp2)) +dac-patterns:29,G((p0 & !p1 & Fp1) -> ((p2 -> (!p1 U (!p1 & p3))) U p1)) +dac-patterns:30,G((p0 & !p1) -> ((p2 -> (!p1 U (!p1 & p3))) W p1)) +dac-patterns:31,Fp0 -> (!p0 U (!p0 & p1 & X(!p0 U p2))) +dac-patterns:32,Fp0 -> (!p1 U (p0 | (!p1 & p2 & X(!p1 U p3)))) +dac-patterns:33,G!p0 | (!p0 U ((p0 & Fp1) -> (!p1 U (!p1 & p2 & X(!p1 U p3))))) +dac-patterns:34,G((p0 & Fp1) -> (!p2 U (p1 | (!p2 & p3 & X(!p2 U p4))))) +dac-patterns:35,G(p0 -> (Fp1 -> (!p1 U (p2 | (!p1 & p3 & X(!p1 U p4)))))) +dac-patterns:36,F(p0 & XFp1) -> (!p0 U p2) +dac-patterns:37,Fp0 -> (!(!p0 & p1 & X(!p0 U (!p0 & p2))) U (p0 | p3)) +dac-patterns:38,G!p0 | (!p0 U (p0 & (F(p1 & XFp2) -> (!p1 U p3)))) +dac-patterns:39,G((p0 & Fp1) -> (!(!p1 & p2 & X(!p1 U (!p1 & p3))) U (p1 | p4))) +dac-patterns:40,G(p0 -> ((!(!p1 & p2 & X(!p1 U (!p1 & p3))) U (p1 | p4)) | G!(p2 & XFp3))) +dac-patterns:41,G((p0 & XFp1) -> XF(p1 & Fp2)) +dac-patterns:42,Fp0 -> (((p1 & X(!p0 U p2)) -> X(!p0 U (p2 & Fp3))) U p0) +dac-patterns:43,G(p0 -> G((p1 & XFp2) -> X(!p2 U (p2 & Fp3)))) +dac-patterns:44,G((p0 & Fp1) -> (((p2 & X(!p1 U p3)) -> X(!p1 U (p3 & Fp4))) U p1)) +dac-patterns:45,G(p0 -> (((p1 & X(!p2 U p3)) -> X(!p2 U (p3 & Fp4))) U (p2 | G((p1 & X(!p2 U p3)) -> X(!p2 U (p3 & Fp4)))))) +dac-patterns:46,G(p0 -> F(p1 & XFp2)) +dac-patterns:47,Fp0 -> ((p1 -> (!p0 U (!p0 & p2 & X(!p0 U p3)))) U p0) +dac-patterns:48,G(p0 -> G(p1 -> (p2 & XFp3))) +dac-patterns:49,G((p0 & Fp1) -> ((p2 -> (!p1 U (!p1 & p3 & X(!p1 U p4)))) U p1)) +dac-patterns:50,G(p0 -> ((p1 -> (!p2 U (!p2 & p3 & X(!p2 U p4)))) U (p2 | G(p1 -> (p3 & XFp4))))) +dac-patterns:51,G(p0 -> F(p1 & !p2 & X(!p2 U p3))) +dac-patterns:52,Fp0 -> ((p1 -> (!p0 U (!p0 & p2 & !p3 & X((!p0 & !p3) U p4)))) U p0) +dac-patterns:53,G(p0 -> G(p1 -> (p2 & !p3 & X(!p3 U p4)))) +dac-patterns:54,G((p0 & Fp1) -> ((p2 -> (!p1 U (!p1 & p3 & !p4 & X((!p1 & !p4) U p5)))) U p1)) +dac-patterns:55,G(p0 -> ((p1 -> (!p2 U (!p2 & p3 & !p4 & X((!p2 & !p4) U p5)))) U (p2 | G(p1 -> (p3 & !p4 & X(!p4 U p5)))))) +eh-patterns:1,p0 U (p1 & Gp2) +eh-patterns:2,p0 U (p1 & X(p2 U p3)) +eh-patterns:3,p0 U (p1 & X(p2 & F(p3 & XF(p4 & XF(p5 & XFp6))))) +eh-patterns:4,F(p0 & XGp1) +eh-patterns:5,F(p0 & X(p1 & XFp2)) +eh-patterns:6,F(p0 & X(p1 U p2)) +eh-patterns:7,FGp0 | GFp1 +eh-patterns:8,G(p0 -> (p1 U p2)) +eh-patterns:9,G(p0 & XF(p1 & XF(p2 & XFp3))) +eh-patterns:10,GFp0 & GFp1 & GFp2 & GFp3 & GFp4 +eh-patterns:11,(p0 U (p1 U p2)) | (p1 U (p2 U p0)) | (p2 U (p0 U p1)) +eh-patterns:12,G(p0 -> (p1 U (Gp2 | Gp3))) +hkrss-patterns:1,G(Fp0 & F!p0) +hkrss-patterns:2,GFp0 & GF!p0 +hkrss-patterns:3,GF(!(p1 <-> Xp1) | !(p0 <-> Xp0)) +hkrss-patterns:4,GF(!(p1 <-> Xp1) | !(p0 <-> Xp0) | !(p2 <-> Xp2) | !(p3 <-> Xp3)) +hkrss-patterns:5,G!p0 +hkrss-patterns:6,G((p0 -> F!p0) & (!p0 -> Fp0)) +hkrss-patterns:7,G(p0 -> F(p0 & p1)) +hkrss-patterns:8,G(p0 -> F((!p0 & p1 & p2 & p3) -> Fp4)) +hkrss-patterns:9,G(p0 -> F!p1) +hkrss-patterns:10,G(p0 -> Fp1) +hkrss-patterns:11,G(p0 -> F(p1 -> Fp2)) +hkrss-patterns:12,G(p0 -> F((p1 & p2) -> Fp3)) +hkrss-patterns:13,G((p0 -> Fp1) & (p2 -> Fp3) & (p4 -> Fp5) & (p6 -> Fp7)) +hkrss-patterns:14,G(!p0 & !p1) +hkrss-patterns:15,G!(p0 & p1) +hkrss-patterns:16,G(p0 -> p1) +hkrss-patterns:17,G((p0 -> !p1) & (p1 -> !p0)) +hkrss-patterns:18,G(!p0 -> (p1 <-> !p2)) +hkrss-patterns:19,G((!p0 & (p1 | p2 | p3)) -> p4) +hkrss-patterns:20,G((p0 & p1) -> (p2 | !(p3 & p4))) +hkrss-patterns:21,G((!p0 & p1 & !p2 & !p3 & !p4) -> F(!p5 & !p6 & !p7 & !p8)) +hkrss-patterns:22,G((p0 & p1 & !p2 & !p3 & !p4) -> F(p5 & !p6 & !p7 & !p8)) +hkrss-patterns:23,G(!p0 -> !(p1 & p2 & p3 & p4 & p5)) +hkrss-patterns:24,G(!p0 -> ((p1 & p2 & p3 & p4) -> !p5)) +hkrss-patterns:25,G((p0 & p1) -> (p2 | p3 | !(p4 & p5))) +hkrss-patterns:26,G((!p0 & (p1 | p2 | p3 | p4)) -> (!p5 <-> p6)) +hkrss-patterns:27,G((p0 & p1) -> (p2 | p3 | p4 | !(p5 & p6))) +hkrss-patterns:28,G((p0 & p1) -> (p2 | p3 | p4 | p5 | !(p6 & p7))) +hkrss-patterns:29,G((p0 & p1 & !p2 & Xp2) -> X(p3 | X(!p1 | p3))) +hkrss-patterns:30,G((p0 & p1 & !p2 & Xp2) -> X(X!p1 | (p2 U (!p2 U (p2 U (!p1 | p3)))))) +hkrss-patterns:31,G(p0 & p1 & !p2 & Xp2) -> X(X!p1 | (p2 U (!p2 U (p2 U (!p1 | p3))))) +hkrss-patterns:32,G(p0 -> (p1 U (!p1 U (!p2 | p3)))) +hkrss-patterns:33,G(p0 -> (p1 U (!p1 U (p2 | p3)))) +hkrss-patterns:34,G((!p0 & p1) -> Xp2) +hkrss-patterns:35,G(p0 -> X(p0 | p1)) +hkrss-patterns:36,G((!(p1 <-> Xp1) | !(p0 <-> Xp0) | !(p2 <-> Xp2) | !(p3 <-> Xp3)) -> (X!p4 & X(!(!(p1 <-> Xp1) | !(p0 <-> Xp0) | !(p2 <-> Xp2) | !(p3 <-> Xp3)) U p4))) +hkrss-patterns:37,G((p0 & !p1 & Xp1 & Xp0) -> (p2 -> Xp3)) +hkrss-patterns:38,G(p0 -> X(!p0 U p1)) +hkrss-patterns:39,G((!p0 & Xp0) -> X((p0 U p1) | Gp0)) +hkrss-patterns:40,G((!p0 & Xp0) -> X(p0 U (p0 & !p1 & X(p0 & p1)))) +hkrss-patterns:41,G((!p0 & Xp0) -> X(p0 U (p0 & !p1 & X(p0 & p1 & (p0 U (p0 & !p1 & X(p0 & p1))))))) +hkrss-patterns:42,G((p0 & X!p0) -> X(!p0 U (!p0 & !p1 & X(!p0 & p1 & (!p0 U (!p0 & !p1 & X(!p0 & p1))))))) +hkrss-patterns:43,G((p0 & X!p0) -> X(!p0 U (!p0 & !p1 & X(!p0 & p1 & (!p0 U (!p0 & !p1 & X(!p0 & p1 & (!p0 U (!p0 & !p1 & X(!p0 & p1)))))))))) +hkrss-patterns:44,G((!p0 & Xp0) -> X(!(!p0 & Xp0) U (!p1 & Xp1))) +hkrss-patterns:45,G(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X(!p0 | X!p0))))))))))) +hkrss-patterns:46,G((Xp0 -> p0) -> (p1 <-> Xp1)) +hkrss-patterns:47,G((Xp0 -> p0) -> ((p1 -> Xp1) & (!p1 -> X!p1))) +hkrss-patterns:48,!p0 U G!((p1 & p2) | (p3 & p4) | (p2 & p3) | (p2 & p4) | (p1 & p4) | (p1 & p3)) +hkrss-patterns:49,!p0 U p1 +hkrss-patterns:50,(p0 U p1) | Gp0 +hkrss-patterns:51,p0 & XG!p0 +hkrss-patterns:52,XG(p0 -> (G!p1 | (!Xp1 U p2))) +hkrss-patterns:53,XG((p0 & !p1) -> (G!p1 | (!p1 U p2))) +hkrss-patterns:54,XG((p0 & p1) -> ((p1 U p2) | Gp1)) +hkrss-patterns:55,Xp0 & G((!p0 & Xp0) -> XXp0) +sb-patterns:1,p0 U p1 +sb-patterns:2,p0 U (p1 U p2) +sb-patterns:3,!(p0 U (p1 U p2)) +sb-patterns:4,GFp0 -> GFp1 +sb-patterns:5,Fp0 U Gp1 +sb-patterns:6,Gp0 U p1 +sb-patterns:7,!(Fp0 <-> Fp1) +sb-patterns:8,!(GFp0 -> GFp1) +sb-patterns:9,!(GFp0 <-> GFp1) +sb-patterns:10,p0 R (p0 | p1) +sb-patterns:11,(Xp0 U Xp1) | !X(p0 U p1) +sb-patterns:12,(Xp0 U p1) | !X(p0 U (p0 & p1)) +sb-patterns:13,G(p0 -> Fp1) & ((Xp0 U p1) | !X(p0 U (p0 & p1))) +sb-patterns:14,G(p0 -> Fp1) & ((Xp0 U Xp1) | !X(p0 U p1)) +sb-patterns:15,G(p0 -> Fp1) +sb-patterns:16,!G(p0 -> X(p1 R p2)) +sb-patterns:17,!(FGp0 | FGp1) +sb-patterns:18,G(Fp0 & Fp1) +sb-patterns:19,Fp0 & F!p0 +sb-patterns:20,(p0 & Xp1) R X(((p2 U p3) R p0) U (p2 R p0)) +sb-patterns:21,Gp2 | (G(p0 | GFp1) & G(p2 | GF!p1)) | Gp0 +sb-patterns:22,Gp0 | Gp2 | (G(p0 | FGp1) & G(p2 | FG!p1)) +sb-patterns:23,!(Gp2 | (G(p0 | GFp1) & G(p2 | GF!p1)) | Gp0) +sb-patterns:24,!(Gp0 | Gp2 | (G(p0 | FGp1) & G(p2 | FG!p1))) +sb-patterns:25,G(p0 | XGp1) & G(p2 | XG!p1) +sb-patterns:26,G(p0 | (Xp1 & X!p1)) +sb-patterns:27,p0 | (p1 U p0) #+end_example Note that ~--sb-patterns=2 --sb-patterns=4 --sb-patterns=21..22~ also diff --git a/tests/core/ltl2tgba2.test b/tests/core/ltl2tgba2.test index d823080c7..c5d523401 100755 --- a/tests/core/ltl2tgba2.test +++ b/tests/core/ltl2tgba2.test @@ -1,7 +1,7 @@ #!/bin/sh # -*- coding: utf-8 -*- -# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 -# Laboratoire de Recherche et Développement de l'Epita (LRDE). +# Copyright (C) 2009-2017 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. @@ -24,11 +24,12 @@ . ./defs # If the size of automata produced by ltl2tgba on the formulas we -# commonly use as benchmark, we want to notice it. +# commonly use as benchmark change, we want to notice it. set -e -genltl --dac-patterns --eh-patterns --sb-patterns --format=%F,%L,%f >pos -(cat pos; ltlfilt --negate pos/3 --format='!%<,%f') | ltlfilt -u -F-/3 >formulas +genltl --dac --eh --sb --hkrss --format=%F,%L,%f >pos +(cat pos; ltlfilt --negate pos/3 --format='!%<,%f') | + ltlfilt -u -F-/3 >formulas ltl2tgba -Fformulas/3 --stats='%<,%f, %s,%t' | ltl2tgba -D -F-/3 --stats='%<,%f,%>, %s,%t' | @@ -129,6 +130,59 @@ sb-patterns,24, 4,16, 4,16, 4,16, 4,16 sb-patterns,25, 3,10, 3,10, 3,10, 3,10 sb-patterns,26, 1,1, 1,1, 1,1, 1,1 sb-patterns,27, 2,7, 2,7, 2,7, 2,7 +hkrss-patterns,1, 1,2, 1,2, 3,6, 3,6 +hkrss-patterns,2, 1,2, 1,2, 3,6, 3,6 +hkrss-patterns,3, 5,36, 5,36, 5,36, 5,36 +hkrss-patterns,4, 9,400, 9,400, 9,400, 9,400 +hkrss-patterns,6, 1,2, 1,2, 3,6, 3,6 +hkrss-patterns,7, 2,8, 2,8, 2,8, 2,8 +hkrss-patterns,8, 1,1, 1,1, 1,1, 1,1 +hkrss-patterns,9, 2,8, 2,8, 2,8, 2,8 +hkrss-patterns,11, 2,16, 2,16, 2,16, 2,16 +hkrss-patterns,12, 2,32, 2,32, 2,32, 2,32 +hkrss-patterns,13, 16,4096, 16,4096, 40,10240, 40,10240 +hkrss-patterns,14, 1,1, 1,1, 1,1, 1,1 +hkrss-patterns,15, 1,3, 1,3, 1,3, 1,3 +hkrss-patterns,16, 1,3, 1,3, 1,3, 1,3 +hkrss-patterns,17, 1,3, 1,3, 1,3, 1,3 +hkrss-patterns,18, 1,6, 1,6, 1,6, 1,6 +hkrss-patterns,19, 1,25, 1,25, 1,25, 1,25 +hkrss-patterns,20, 1,31, 1,31, 1,31, 1,31 +hkrss-patterns,21, 2,1024, 2,1024, 2,1024, 2,1024 +hkrss-patterns,22, 2,1024, 2,1024, 2,1024, 2,1024 +hkrss-patterns,23, 1,63, 1,63, 1,63, 1,63 +hkrss-patterns,24, 1,63, 1,63, 1,63, 1,63 +hkrss-patterns,25, 1,63, 1,63, 1,63, 1,63 +hkrss-patterns,26, 1,98, 1,98, 1,98, 1,98 +hkrss-patterns,27, 1,127, 1,127, 1,127, 1,127 +hkrss-patterns,28, 1,255, 1,255, 1,255, 1,255 +hkrss-patterns,29, 3,44, 3,44, 3,44, 3,44 +hkrss-patterns,30, 5,78, 5,78, 5,78, 5,78 +hkrss-patterns,31, 1,1, 1,1, 1,1, 1,1 +hkrss-patterns,32, 3,46, 3,46, 3,46, 3,46 +hkrss-patterns,33, 3,46, 3,46, 3,46, 3,46 +hkrss-patterns,34, 2,12, 2,12, 2,12, 2,12 +hkrss-patterns,35, 2,7, 2,7, 2,7, 2,7 +hkrss-patterns,36, 34,192, 34,192, 35,208, 35,208 +hkrss-patterns,37, 2,30, 2,30, 2,30, 2,30 +hkrss-patterns,38, 2,7, 2,7, 3,10, 3,10 +hkrss-patterns,39, 3,11, 3,11, 3,11, 3,11 +hkrss-patterns,40, 4,13, 4,13, 4,13, 4,13 +hkrss-patterns,41, 6,17, 6,17, 6,17, 6,17 +hkrss-patterns,42, 6,17, 6,17, 6,17, 6,17 +hkrss-patterns,43, 8,21, 8,21, 8,21, 8,21 +hkrss-patterns,44, 6,22, 6,22, 6,22, 6,22 +hkrss-patterns,45, 12,23, 12,23, 12,23, 12,23 +hkrss-patterns,46, 4,14, 5,14, 4,14, 5,14 +hkrss-patterns,47, 4,14, 5,14, 4,14, 5,14 +hkrss-patterns,48, 2,36, 2,36, 2,36, 2,36 +hkrss-patterns,49, 2,7, 2,7, 2,7, 2,7 +hkrss-patterns,50, 2,7, 2,7, 2,7, 2,7 +hkrss-patterns,51, 2,2, 2,2, 2,2, 2,2 +hkrss-patterns,52, 4,25, 4,25, 5,29, 5,29 +hkrss-patterns,53, 3,22, 3,22, 3,22, 3,22 +hkrss-patterns,54, 3,22, 3,22, 3,22, 3,22 +hkrss-patterns,55, 5,8, 5,8, 5,8, 5,8 !dac-patterns,1, 2,4, 2,4, 2,4, 2,4 !dac-patterns,2, 3,10, 3,10, 3,10, 3,10 !dac-patterns,3, 3,12, 3,12, 3,12, 3,12 @@ -214,6 +268,59 @@ sb-patterns,27, 2,7, 2,7, 2,7, 2,7 !sb-patterns,25, 4,32, 4,32, 4,32, 4,32 !sb-patterns,26, 2,4, 2,4, 2,4, 2,4 !sb-patterns,27, 2,6, 2,6, 2,6, 2,6 +!hkrss-patterns,1, 3,6, 3,6, 3,6, 3,6 +!hkrss-patterns,2, 3,6, 3,6, 3,6, 3,6 +!hkrss-patterns,3, 5,12, 5,12, 5,12, 5,12 +!hkrss-patterns,4, 17,48, 17,48, 17,48, 17,48 +!hkrss-patterns,6, 3,6, 3,6, 3,6, 3,6 +!hkrss-patterns,7, 2,8, 2,8, 2,8, 2,8 +!hkrss-patterns,8, 1,0, 1,0, 1,0, 1,0 +!hkrss-patterns,9, 2,7, 2,7, 2,7, 2,7 +!hkrss-patterns,11, 2,11, 2,11, 2,11, 2,11 +!hkrss-patterns,12, 2,19, 2,19, 2,19, 2,19 +!hkrss-patterns,13, 5,1024, 5,1024, 5,1024, 5,1024 +!hkrss-patterns,14, 2,8, 2,8, 2,8, 2,8 +!hkrss-patterns,15, 2,8, 2,8, 2,8, 2,8 +!hkrss-patterns,16, 2,8, 2,8, 2,8, 2,8 +!hkrss-patterns,17, 2,8, 2,8, 2,8, 2,8 +!hkrss-patterns,18, 2,16, 2,16, 2,16, 2,16 +!hkrss-patterns,19, 2,64, 2,64, 2,64, 2,64 +!hkrss-patterns,20, 2,64, 2,64, 2,64, 2,64 +!hkrss-patterns,21, 2,1007, 2,1007, 2,1007, 2,1007 +!hkrss-patterns,22, 2,1007, 2,1007, 2,1007, 2,1007 +!hkrss-patterns,23, 2,128, 2,128, 2,128, 2,128 +!hkrss-patterns,24, 2,128, 2,128, 2,128, 2,128 +!hkrss-patterns,25, 2,128, 2,128, 2,128, 2,128 +!hkrss-patterns,26, 2,256, 2,256, 2,256, 2,256 +!hkrss-patterns,27, 2,256, 2,256, 2,256, 2,256 +!hkrss-patterns,28, 2,512, 2,512, 2,512, 2,512 +!hkrss-patterns,29, 4,64, 4,64, 4,64, 4,64 +!hkrss-patterns,30, 6,48, 6,48, 6,48, 6,48 +!hkrss-patterns,31, 1,0, 1,0, 1,0, 1,0 +!hkrss-patterns,32, 4,42, 4,42, 4,42, 4,42 +!hkrss-patterns,33, 4,42, 4,42, 4,42, 4,42 +!hkrss-patterns,34, 3,24, 3,24, 3,24, 3,24 +!hkrss-patterns,35, 3,12, 3,12, 3,12, 3,12 +!hkrss-patterns,36, 19,784, 19,784, 19,784, 19,784 +!hkrss-patterns,37, 3,48, 3,48, 3,48, 3,48 +!hkrss-patterns,38, 3,12, 3,12, 3,12, 3,12 +!hkrss-patterns,39, 4,16, 4,16, 4,16, 4,16 +!hkrss-patterns,40, 5,19, 5,19, 5,19, 5,19 +!hkrss-patterns,41, 7,27, 7,27, 7,27, 7,27 +!hkrss-patterns,42, 7,27, 7,27, 7,27, 7,27 +!hkrss-patterns,43, 9,35, 9,35, 9,35, 9,35 +!hkrss-patterns,44, 7,24, 7,24, 7,24, 7,24 +!hkrss-patterns,45, 13,26, 13,26, 13,26, 13,26 +!hkrss-patterns,46, 6,24, 6,24, 6,24, 6,24 +!hkrss-patterns,47, 6,24, 6,24, 6,24, 6,24 +!hkrss-patterns,48, 3,96, 3,96, 4,128, 4,128 +!hkrss-patterns,49, 2,6, 2,6, 2,6, 2,6 +!hkrss-patterns,50, 2,6, 2,6, 2,6, 2,6 +!hkrss-patterns,51, 3,6, 3,6, 3,6, 3,6 +!hkrss-patterns,52, 5,37, 5,37, 5,37, 5,37 +!hkrss-patterns,53, 4,32, 4,32, 4,32, 4,32 +!hkrss-patterns,54, 4,32, 4,32, 4,32, 4,32 +!hkrss-patterns,55, 5,12, 6,12, 5,12, 6,12 EOF diff output expected