File: Property.h

package info (click to toggle)
maria 1.3.4-5
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 3,956 kB
  • ctags: 5,485
  • sloc: cpp: 43,267; yacc: 8,080; sh: 460; ansic: 436; lisp: 395; makefile: 288; perl: 21
file content (158 lines) | stat: -rw-r--r-- 5,096 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Property automaton -*- c++ -*-

#ifndef PROPERTY_H_
# define PROPERTY_H_
# ifdef __GNUC__
#  pragma interface
# endif // __GNUC__

# include "PropertyState.h"
# include "BitVector.h"

/** @file Property.h
 * Automaton representing the negation of a property being verified
 */

/* Copyright  1999-2002 Marko Mkel (msmakela@tcs.hut.fi).

   This file is part of MARIA, a reachability analyzer and model checker
   for high-level Petri nets.

   MARIA is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   MARIA is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   The GNU General Public License is often shipped with GNU software, and
   is generally kept in a file called COPYING or LICENSE.  If you do not
   have a copy of the license, write to the Free Software Foundation,
   59 Temple Place, Suite 330, Boston, MA 02111 USA. */

/** Property automaton */
class Property
{
public:
  /** Unary operators */
  enum Unop { opNot, opFinally, opGlobally, opNext };
  /** Binary operators */
  enum Binop { opAnd, opOr, opUntil, opRelease };

  /** Constructor */
  Property ();
private:
  /** Copy constructor */
  explicit Property (const class Property& old);
  /** Assignment operator */
  class Property operator= (const class Property& old);
public:
  /** Destructor */
  ~Property ();

# ifdef BUILTIN_LTL
  /** Create the property automaton from an expression
   * @param expr	expression to be translated to an automaton
   */
  bool create (class Expression& expr);
# else // BUILTIN_LTL
  /** Create the property automaton from an expression
   * @param translator	command line for invoking an external translator
   * @param expr	expression to be translated to an automaton
   * @return		true if the automaton was successfully generated
   */
  bool create (const char* translator,
	       class Expression& expr);
# endif // BUILTIN_LTL

  /** Append a constant to the formula string
   * @param b		the constant (true or false)
   * @return		the translated object
   */
  class Ltl* addConstant (bool b);

  /** Append a unary operator to the formula string
   * @param op		operator to be appended
   * @param expr	the operand
   * @return		the translated object
   */
  class Ltl* addUnop (enum Unop op,
		      class Expression& expr);

  /** Append a unary operator to the formula string
   * @param op		operator to be appended
   * @param left	the first operand
   * @param right	the second operand
   * @return		the translated object
   */
  class Ltl* addBinop (enum Binop op,
		       class Expression& left,
		       class Expression& right);

  /** Append a proposition to the formula string
   * @param expr	proposition to be appended
   * @return		the translated object
   */
  class Ltl* addExpression (class Expression& expr);

  /** Determine the index number of the initial state */
  unsigned getInitialState () const { return myInitialState; }
  /** Determine the index number of the accepting state */
  unsigned getFinalState () const { return myFinalState; }

  /** Determine the number of states in the property automaton */
  unsigned getNumStates () const { return myNumStates; }
  /** Determine the number of acceptance sets in the property automaton */
  unsigned getNumSets () const { return myNumSets; }

  /** Access a state of the automaton
   * @param i	number of the state
   * @return	the state
   */
  const class PropertyState& operator[] (unsigned i) const {
    assert (i < myNumStates);
    return myStates[i];
  }
  /** Determine whether a state belongs to an acceptance set
   * @param i	number of the state
   * @param acc	number of the acceptance set
   */
  bool accepts (unsigned i, unsigned acc) const {
    assert (!isFinite ());
    assert (myStatesAccept && i < myNumStates);
    assert (acc < myNumSets);
    return (*myStatesAccept)[myNumSets ? i * myNumSets + acc : i];
  }
  /** Determine whether the automaton is a finite-word automaton */
  bool isFinite () const { return !myNumSets; }

private:
# ifdef BUILTIN_LTL
  /** Flag: is the formula negated? */
  bool myNegated;
# else // BUILTIN_LTL
  /** File handle for translating the formula */
  int myFD;
# endif // BUILTIN_LTL
  /** Number of atomic propositions */
  unsigned myNumExprs;
  /** The atomic propositions (boolean expressions, the alphabet) */
  class Expression** myExprs;
  /** Number of states */
  unsigned myNumStates;
  /** The states */
  class PropertyState* myStates;
  /** Acceptance sets the states belong to */
  class BitVector* myStatesAccept;
  /** Index number of the initial state */
  unsigned myInitialState;
  /** Index number of the accepting state (for finite-word automata) */
  unsigned myFinalState;
  /** Number of acceptance sets */
  unsigned myNumSets;
};

#endif // PROPERTY_H_