You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
3.7 KiB
160 lines
3.7 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2007 Carlos Bederian
|
|
//
|
|
// This file is part of PRISM.
|
|
//
|
|
// PRISM 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 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// PRISM 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.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with PRISM; if not, write to the Free Software Foundation,
|
|
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
//
|
|
//==============================================================================
|
|
|
|
package jltl2ba;
|
|
|
|
import java.util.Vector;
|
|
import java.util.Iterator;
|
|
import java.io.PrintStream;
|
|
|
|
/**
|
|
* Class representing a set of atomic propositions (AP).
|
|
*/
|
|
public class APSet implements Iterable<String> {
|
|
|
|
private Vector<String> vector;
|
|
|
|
/**
|
|
* Constructor.
|
|
*/
|
|
public APSet() {
|
|
vector = new Vector<String>();
|
|
}
|
|
|
|
/**
|
|
* Adds a new AP to the set.
|
|
* @param name the name of the AP
|
|
* @return the index of the added AP
|
|
*/
|
|
public int addAP(String name) {
|
|
int i = vector.indexOf(name);
|
|
|
|
if (i == -1) {
|
|
vector.add(name);
|
|
return vector.size() - 1;
|
|
}
|
|
else return i;
|
|
}
|
|
|
|
/**
|
|
* Gets the name of a certain AP.
|
|
* @param index index of the AP
|
|
* @return string-ref with the name
|
|
*/
|
|
public String getAP(int index) {
|
|
return vector.elementAt(index);
|
|
}
|
|
|
|
/**
|
|
* Searches for an existing AP in the APSet and returns the index.
|
|
* @return the index of the AP, or -1 if not found.
|
|
*/
|
|
public int indexOf(String s) {
|
|
return vector.indexOf(s);
|
|
}
|
|
|
|
public boolean hasAP(String s) {
|
|
return vector.contains(s);
|
|
}
|
|
|
|
/**
|
|
* Get the size of this set
|
|
* @return the number of APs in this set.
|
|
*/
|
|
public int size() {
|
|
return vector.size();
|
|
}
|
|
|
|
/**
|
|
* Get the size of the powerset 2^APSet
|
|
* @return the size of 2^AP
|
|
*/
|
|
public int powersetSize() {
|
|
return (1<<size());
|
|
}
|
|
|
|
/**
|
|
* Equality check.
|
|
* @param other the other APSet
|
|
* @return <b>true</b> if this and the other APSet are equal
|
|
*/
|
|
public boolean equals(APSet other)
|
|
{
|
|
return this.vector.equals(other.vector);
|
|
}
|
|
|
|
public boolean equals(Object other)
|
|
{
|
|
return ((other instanceof APSet) && this.equals((APSet) other));
|
|
}
|
|
|
|
/**
|
|
* Create a new APSet with the same number of
|
|
* atomic propositions, but named 'p0', 'p1', 'p2', ...
|
|
* The caller takes ownership of the memory of the created APSet.
|
|
* @return APSet* to newly created APSet
|
|
*/
|
|
public APSet createCanonical() {
|
|
APSet canonical = new APSet();
|
|
for (int i=0; i < size(); i++)
|
|
canonical.addAP("p" + i);
|
|
return canonical;
|
|
}
|
|
|
|
public Iterator<String> iterator()
|
|
{
|
|
return vector.iterator();
|
|
}
|
|
|
|
public Iterator<APElement> elementIterator()
|
|
{
|
|
return new APElementIterator(vector.size());
|
|
}
|
|
|
|
public void print(PrintStream out) {
|
|
for (int i = 0; i < size(); i++) {
|
|
out.println(i + ": " + getAP(i));
|
|
}
|
|
}
|
|
|
|
/** Print this APSet as a HOA AP: header */
|
|
public void print_hoa(PrintStream out) {
|
|
out.print("AP: ");
|
|
out.print(size());
|
|
for (String ap : this) {
|
|
// TODO(JK): proper quoting
|
|
out.print(" \""+ap+"\"");
|
|
}
|
|
out.println();
|
|
}
|
|
|
|
public String toString() {
|
|
String rv = "{";
|
|
for (Iterator<String> it = this.iterator(); it.hasNext(); ) {
|
|
rv = rv + it.next();
|
|
if (it.hasNext()) {
|
|
rv = rv + ",";
|
|
}
|
|
}
|
|
return rv + "}";
|
|
}
|
|
}
|