File: Quantifier.h

package info (click to toggle)
maria 1.3.5-2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 3,980 kB
  • ctags: 5,458
  • sloc: cpp: 43,402; yacc: 8,080; ansic: 436; sh: 404; lisp: 395; makefile: 291; perl: 21
file content (196 lines) | stat: -rw-r--r-- 5,835 bytes parent folder | download | duplicates (5)
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
// Quantifier expression -*- c++ -*-

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

# include "Expression.h"
# include <assert.h>
# include <list>

/** @file Quantifier.h
 * Quantifier variables
 */

/* Copyright  1998-2002,2005 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. */

/** Quantifier variable */
class Quantifier
{
public:

  /** Result of a check */
  enum Result { undefined, pass, fail };

  /** Constructor
   * @param name	variable name
   * @param type	variable type
   * @param condition	optional condition for the quantifier
   */
  Quantifier (char* name, const class Type& type,
	      class Expression* condition);

  /** Constructor
   * @param variable	variable
   * @param condition	optional condition for the quantifier
   */
  Quantifier (class VariableDefinition& variable,
	      class Expression* condition);

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

  /** Determine the variable */
  const class VariableDefinition& getVariable () const { return *myVariable; }
  /** Determine the condition expression */
  const class Expression* getCondition () const { return myCondition; }
  /** Set the condition expression */
  void setCondition (class Expression& condition) {
    assert (!myCondition); myCondition = &condition;
  }

  /** Determine whether the given valuation is accepted by submarking criteria
   * @param valuation	Valuation to be checked
   * @return		(@see Result)
   */
  enum Result isAcceptable (const class Valuation& valuation) const;

  /** Equality comparison operator */
  bool operator== (const class Quantifier& other) const {
    return myVariable == other.myVariable &&
      *myCondition == *other.myCondition;
  }

  /** Ordering comparison operator */
  bool operator< (const class Quantifier& other) const {
    if (myVariable < other.myVariable) return true;
    if (other.myVariable < myVariable) return false;
    return *myCondition < *other.myCondition;
  }

private:
  /** Variable */
  class VariableDefinition* myVariable;
  /** Quantifier condition */
  class Expression* myCondition;
};

/** Quantifier variable list */
class QuantifierList
{
public:
  /** List of quantifier variables */
  typedef std::list<class Quantifier*> List;
  /** Iterator to the quantifier list */
  typedef List::iterator iterator;
  /** Constant iterator to the quantifier list */
  typedef List::const_iterator const_iterator;

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

  /** Prepend a quantifier to the list
   * @param quantifier	quantifier to be prepended
   */
  void prepend (class Quantifier& quantifier) {
    myList.push_front (&quantifier);
  }
  /** Append a quantifier to the list
   * @param quantifier	quantifier to be appended
   */
  void append (class Quantifier& quantifier) {
    myList.insert (end (), &quantifier);
  }

  /** @name Accessors to the quantifier list */
  /*@{*/
  bool empty () const { return myList.empty (); }
  size_t size () const { return myList.size (); }
  const_iterator begin () const { return myList.begin (); }
  const_iterator end () const { return myList.end (); }
  iterator begin () { return myList.begin (); }
  iterator end () { return myList.end (); }
  /*@}*/

  /** Equality comparison operator */
  bool operator== (const class QuantifierList& other) const {
    if (size () != other.size ())
      return false;
    for (const_iterator i = begin (), j = other.begin ();
	 i != end (); i++, j++)
      if (!(**i == **j))
	return false;
    return true;
  }

  /** Ordering comparison operator */
  bool operator< (const class QuantifierList& other) const {
    if (size () < other.size ())
      return true;
    if (other.size () < size ())
      return false;
    for (const_iterator i = begin (), j = other.begin ();
	 i != end (); i++, j++)
      if (**i < **j)
	return true;
      else if (**j < **i)
	return false;
    return false;
  }

  /** Augment a valuation with the first values of the quantifiers
   * @param valuation	valuation to be augmented
   * @return		pass, fail (invalid valuation) or undefined (error)
   */
  enum Quantifier::Result augment (class Valuation& valuation) const;

  /** Step to the next values of the quantifiers
   * @return		pass, fail (wrapped) or undefined (error)
   */
  enum Quantifier::Result advance (class Valuation& valuation) const;

  /** Clear a valuation from assignments to the quantifiers
   * @param valuation	valuation to be cleared
   */
  void clear (class Valuation& valuation) const;

private:
  /** The list of quantifiers */
  List myList;
};

#endif // QUANTIFIER_H_