import java.io.*;
import java.util.zip.DataFormatException;

public abstract class Relation implements java.io.Serializable, Cloneable
{
	protected short data = 0;
	
    public abstract void set(String s) throws FormatException;
    public abstract void set(int d) throws FormatException;
    public abstract void setRandom();
    public abstract void setRandomDeterminate();
    public abstract boolean isDeterminate();
    public abstract boolean isAny();
    public abstract Relation transition(Relation r);
    public abstract Relation intersection(Relation r);
    public abstract Relation union(Relation r);
    public abstract Relation inverse();
	public abstract Relation propagate(Relation r2, Relation r3);
    
    public Object clone() throws CloneNotSupportedException
    {
    	return super.clone();
    }
    
    public boolean isNull()
    {
    	return (data == 0);
    }
    
    public boolean equals(Relation r)
    {
    	return equals(r.data);
    }
    
    public boolean equals(int d)
    {
    	return (data == d);
    }
    
    public boolean equals(String s)
    {
    	Relation a;
    	try
    	{
    		a = (Relation)this.clone();
    	}
    	catch (CloneNotSupportedException e)
    	{
    		throw (new RuntimeException("Unexpected CloneNotSupported Exception"));
    	}
    	try
    	{
    		a.set(s);
    	}
    	catch (FormatException e)
    	{
    		return false;
    	}
    	return equals(a);
    }
    
    public boolean includes(Relation r)
    {
    	return this.includes(r.data);
    }
    
    public boolean includes(int d)
    {
    	return ((data | d) == data);
    }
    
    protected int dataIntersection(Relation r)
    {
    	return (data & r.data);
    }
    
    protected int dataUnion(Relation r)
    {
    	return (data | r.data);
    }
    
    public short getData()
    {
    	return data;
    }
}