diff --git a/bin/autfilt.cc b/bin/autfilt.cc index d48f48c9a..2685fc20b 100644 --- a/bin/autfilt.cc +++ b/bin/autfilt.cc @@ -139,7 +139,83 @@ static const argp_option options[] = { "count", 'c', nullptr, 0, "print only a count of matched automata", 3 }, { "max-count", 'n', "NUM", 0, "output at most NUM automata", 3 }, /**************************************************/ - { nullptr, 0, nullptr, 0, "Transformations:", 5 }, + { nullptr, 0, nullptr, 0, "Filtering options:", 5 }, + { "ap", OPT_AP_N, "RANGE", 0, + "match automata with a number of (declared) atomic propositions in RANGE", + 0 }, + { "used-ap", OPT_USED_AP_N, "RANGE", 0, + "match automata with a number of used atomic propositions in RANGE", 0 }, + { "unused-ap", OPT_UNUSED_AP_N, "RANGE", 0, + "match automata with a number of declared, but unused atomic " + "propositions in RANGE", 0 }, + { "are-isomorphic", OPT_ARE_ISOMORPHIC, "FILENAME", 0, + "keep automata that are isomorphic to the automaton in FILENAME", 0 }, + { "isomorphic", 0, nullptr, OPTION_ALIAS | OPTION_HIDDEN, nullptr, 0 }, + { "unique", 'u', nullptr, 0, + "do not output the same automaton twice (same in the sense that they "\ + "are isomorphic)", 0 }, + { "is-complete", OPT_IS_COMPLETE, nullptr, 0, + "keep complete automata", 0 }, + { "is-deterministic", OPT_IS_DETERMINISTIC, nullptr, 0, + "keep deterministic automata", 0 }, + { "is-empty", OPT_IS_EMPTY, nullptr, 0, + "keep automata with an empty language", 0 }, + { "is-unambiguous", OPT_IS_UNAMBIGUOUS, nullptr, 0, + "keep only unambiguous automata", 0 }, + { "is-terminal", OPT_IS_TERMINAL, nullptr, 0, + "keep only terminal automata", 0 }, + { "is-weak", OPT_IS_WEAK, nullptr, 0, + "keep only weak automata", 0 }, + { "is-inherently-weak", OPT_IS_INHERENTLY_WEAK, nullptr, 0, + "keep only inherently weak automata", 0 }, + { "intersect", OPT_INTERSECT, "FILENAME", 0, + "keep automata whose languages have an non-empty intersection with" + " the automaton from FILENAME", 0 }, + { "included-in", OPT_INCLUDED_IN, "FILENAME", 0, + "keep automata whose languages are included in that of the " + "automaton from FILENAME", 0 }, + { "equivalent-to", OPT_EQUIVALENT_TO, "FILENAME", 0, + "keep automata thare are equivalent (language-wise) to the automaton " + "in FILENAME", 0 }, + { "invert-match", 'v', nullptr, 0, "select non-matching automata", 0 }, + { "states", OPT_STATES, "RANGE", 0, + "keep automata whose number of states is in RANGE", 0 }, + { "edges", OPT_EDGES, "RANGE", 0, + "keep automata whose number of edges is in RANGE", 0 }, + { "acc-sets", OPT_ACC_SETS, "RANGE", 0, + "keep automata whose number of acceptance sets is in RANGE", 0 }, + { "sccs", OPT_SCCS, "RANGE", 0, + "keep automata whose number of SCCs is in RANGE", 0 }, + { "acc-sccs", OPT_ACC_SCCS, "RANGE", 0, + "keep automata whose number of non-trivial accepting SCCs is in RANGE", + 0 }, + { "accepting-sccs", 0, nullptr, OPTION_ALIAS, nullptr, 0 }, + { "rej-sccs", OPT_REJ_SCCS, "RANGE", 0, + "keep automata whose number of non-trivial rejecting SCCs is in RANGE", + 0 }, + { "rejecting-sccs", 0, nullptr, OPTION_ALIAS, nullptr, 0 }, + { "triv-sccs", OPT_TRIV_SCCS, "RANGE", 0, + "keep automata whose number of trivial SCCs is in RANGE", 0 }, + { "trivial-sccs", 0, nullptr, OPTION_ALIAS, nullptr, 0 }, + { "inherently-weak-sccs", OPT_INHERENTLY_WEAK_SCCS, "RANGE", 0, + "keep automata whose number of accepting inherently-weak SCCs is in " + "RANGE. An accepting SCC is inherently weak if it does not have a " + "rejecting cycle.", 0 }, + { "weak-sccs", OPT_WEAK_SCCS, "RANGE", 0, + "keep automata whose number of accepting weak SCCs is in RANGE. " + "In a weak SCC, all transitions belong to the same acceptance sets.", 0 }, + { "terminal-sccs", OPT_TERMINAL_SCCS, "RANGE", 0, + "keep automata whose number of accepting terminal SCCs is in RANGE. " + "Terminal SCCs are weak and complete.", 0 }, + { "accept-word", OPT_ACCEPT_WORD, "WORD", 0, + "keep automata that accept WORD", 0 }, + { "reject-word", OPT_REJECT_WORD, "WORD", 0, + "keep automata that reject WORD", 0 }, + /**************************************************/ + RANGE_DOC_FULL, + WORD_DOC, + /**************************************************/ + { nullptr, 0, nullptr, 0, "Transformations:", 7 }, { "merge-transitions", OPT_MERGE, nullptr, 0, "merge transitions with same destination and acceptance", 0 }, { "product", OPT_PRODUCT_AND, "FILENAME", 0, @@ -213,82 +289,7 @@ static const argp_option options[] = { "highlight-nondet", OPT_HIGHLIGHT_NONDET, "NUM", OPTION_ARG_OPTIONAL, "highlight nondeterministic states and edges with color NUM", 0}, - /**************************************************/ - { nullptr, 0, nullptr, 0, "Filtering options:", 6 }, - { "ap", OPT_AP_N, "RANGE", 0, - "match automata with a number of (declared) atomic propositions in RANGE", - 0 }, - { "used-ap", OPT_USED_AP_N, "RANGE", 0, - "match automata with a number of used atomic propositions in RANGE", 0 }, - { "unused-ap", OPT_UNUSED_AP_N, "RANGE", 0, - "match automata with a number of declared, but unused atomic " - "propositions in RANGE", 0 }, - { "are-isomorphic", OPT_ARE_ISOMORPHIC, "FILENAME", 0, - "keep automata that are isomorphic to the automaton in FILENAME", 0 }, - { "isomorphic", 0, nullptr, OPTION_ALIAS | OPTION_HIDDEN, nullptr, 0 }, - { "unique", 'u', nullptr, 0, - "do not output the same automaton twice (same in the sense that they "\ - "are isomorphic)", 0 }, - { "is-complete", OPT_IS_COMPLETE, nullptr, 0, - "keep complete automata", 0 }, - { "is-deterministic", OPT_IS_DETERMINISTIC, nullptr, 0, - "keep deterministic automata", 0 }, - { "is-empty", OPT_IS_EMPTY, nullptr, 0, - "keep automata with an empty language", 0 }, - { "is-unambiguous", OPT_IS_UNAMBIGUOUS, nullptr, 0, - "keep only unambiguous automata", 0 }, - { "is-terminal", OPT_IS_TERMINAL, nullptr, 0, - "keep only terminal automata", 0 }, - { "is-weak", OPT_IS_WEAK, nullptr, 0, - "keep only weak automata", 0 }, - { "is-inherently-weak", OPT_IS_INHERENTLY_WEAK, nullptr, 0, - "keep only inherently weak automata", 0 }, - { "intersect", OPT_INTERSECT, "FILENAME", 0, - "keep automata whose languages have an non-empty intersection with" - " the automaton from FILENAME", 0 }, - { "included-in", OPT_INCLUDED_IN, "FILENAME", 0, - "keep automata whose languages are included in that of the " - "automaton from FILENAME", 0 }, - { "equivalent-to", OPT_EQUIVALENT_TO, "FILENAME", 0, - "keep automata thare are equivalent (language-wise) to the automaton " - "in FILENAME", 0 }, - { "invert-match", 'v', nullptr, 0, "select non-matching automata", 0 }, - { "states", OPT_STATES, "RANGE", 0, - "keep automata whose number of states is in RANGE", 0 }, - { "edges", OPT_EDGES, "RANGE", 0, - "keep automata whose number of edges is in RANGE", 0 }, - { "acc-sets", OPT_ACC_SETS, "RANGE", 0, - "keep automata whose number of acceptance sets is in RANGE", 0 }, - { "sccs", OPT_SCCS, "RANGE", 0, - "keep automata whose number of SCCs is in RANGE", 0 }, - { "acc-sccs", OPT_ACC_SCCS, "RANGE", 0, - "keep automata whose number of non-trivial accepting SCCs is in RANGE", - 0 }, - { "accepting-sccs", 0, nullptr, OPTION_ALIAS, nullptr, 0 }, - { "rej-sccs", OPT_REJ_SCCS, "RANGE", 0, - "keep automata whose number of non-trivial rejecting SCCs is in RANGE", - 0 }, - { "rejecting-sccs", 0, nullptr, OPTION_ALIAS, nullptr, 0 }, - { "triv-sccs", OPT_TRIV_SCCS, "RANGE", 0, - "keep automata whose number of trivial SCCs is in RANGE", 0 }, - { "trivial-sccs", 0, nullptr, OPTION_ALIAS, nullptr, 0 }, - { "inherently-weak-sccs", OPT_INHERENTLY_WEAK_SCCS, "RANGE", 0, - "keep automata whose number of accepting inherently-weak SCCs is in " - "RANGE. An accepting SCC is inherently weak if it does not have a " - "rejecting cycle.", 0 }, - { "weak-sccs", OPT_WEAK_SCCS, "RANGE", 0, - "keep automata whose number of accepting weak SCCs is in RANGE. " - "In a weak SCC, all transitions belong to the same acceptance sets.", 0 }, - { "terminal-sccs", OPT_TERMINAL_SCCS, "RANGE", 0, - "keep automata whose number of accepting terminal SCCs is in RANGE. " - "Terminal SCCs are weak and complete.", 0 }, - { "accept-word", OPT_ACCEPT_WORD, "WORD", 0, - "keep automata that accept WORD", 0 }, - { "reject-word", OPT_REJECT_WORD, "WORD", 0, - "keep automata that reject WORD", 0 }, - RANGE_DOC_FULL, - WORD_DOC, { nullptr, 0, nullptr, 0, "If any option among --small, --deterministic, or --any is given, " "then the simplification level defaults to --high unless specified "