ConstraintsSet umgebaut in eine KomplexeMenge von Pairs

This commit is contained in:
JanUlrich 2015-04-28 15:27:16 +02:00
parent 7ba9688702
commit 1cb335b46b
7 changed files with 68 additions and 32 deletions

View File

@ -712,7 +712,8 @@ public class SourceFile
oderConstraints.unifyUndConstraints(unifier); oderConstraints.unifyUndConstraints(unifier);
typinferenzLog.debug("Übriggebliebene Konstraints:\n"+oderConstraints+"\n", Section.TYPEINFERENCE); typinferenzLog.debug("Übriggebliebene Konstraints:\n"+oderConstraints+"\n", Section.TYPEINFERENCE);
//Die Constraints in Pair's umwandeln (Karthesisches Produkt bilden): //Die Constraints in Pair's umwandeln (Karthesisches Produkt bilden):
Menge<Menge<Pair>> xConstraints = new Menge<Menge<Pair>>();// = oderConstraints.getConstraints(); Menge<Menge<Pair>> xConstraints = oderConstraints.cartesianProduct();
/*
for(Menge<UndConstraint> uC : oderConstraints.getConstraints()){ //mit dem getConstraints-Aufruf wird das Karthesische Produkt erzeugt. for(Menge<UndConstraint> uC : oderConstraints.getConstraints()){ //mit dem getConstraints-Aufruf wird das Karthesische Produkt erzeugt.
Menge<Pair> cons = new Menge<Pair>(); Menge<Pair> cons = new Menge<Pair>();
for(UndConstraint undCons:uC){ for(UndConstraint undCons:uC){
@ -720,6 +721,7 @@ public class SourceFile
} }
xConstraints.add(cons); xConstraints.add(cons);
} }
*/
typinferenzLog.debug("Karthesisches Produkt der Constraints: "+xConstraints, Section.TYPEINFERENCE); typinferenzLog.debug("Karthesisches Produkt der Constraints: "+xConstraints, Section.TYPEINFERENCE);
finiteClosure.generateFullyNamedTypes(globalAssumptions); finiteClosure.generateFullyNamedTypes(globalAssumptions);

View File

@ -6,8 +6,20 @@ import de.dhbwstuttgart.logger.Logger;
import de.dhbwstuttgart.logger.*; import de.dhbwstuttgart.logger.*;
import de.dhbwstuttgart.typeinference.unify.Unifier; import de.dhbwstuttgart.typeinference.unify.Unifier;
public class ConstraintsSet{ public class ConstraintsSet extends UndMenge<Pair>{
private static final Logger log = Logger.getLogger(ConstraintsSet.class.getName()); private static final Logger log = Logger.getLogger(ConstraintsSet.class.getName());
public void add(ConstraintsSet CSet){
for(KomplexeMenge<Pair> i : CSet.set){
this.addItems(i);
}
}
public void add(KomplexeMenge<Pair> constraint){
this.addItems(constraint);
}
/*
private UndConstraint constraintsSet; private UndConstraint constraintsSet;
public ConstraintsSet(){ public ConstraintsSet(){
@ -15,38 +27,44 @@ public class ConstraintsSet{
} }
public void add(ConstraintsSet CSet){ public void add(ConstraintsSet CSet){
for(OderConstraint element : CSet) constraintsSet.addItems(CSet.getConstraints());
add(element);
} }
public void add(OderConstraint constraint){ public void add(OderConstraint constraint){
constraintsSet.addItems(constraint); constraintsSet.addItems(constraint);
} }
public UndConstraint getConstraints(){
return constraintsSet;
}
*/
/** /**
* Liefert alle Constraint-Variationen * Liefert alle Constraint-Variationen
* @return * @return
*/ */
/*
public Menge<Menge<UndConstraint>> getConstraints(){ public Menge<Menge<UndConstraint>> getConstraints(){
/*
Menge<Menge<UndConstraint>> ret = new Menge<Menge<UndConstraint>>(); Menge<Menge<UndConstraint>> ret = new Menge<Menge<UndConstraint>>();
for(OderConstraint con : constraintsSet){ for(OderConstraint con : constraintsSet){
ret.add(con.getUndConstraints()); ret.add(con.getUndConstraints());
} }
ret = new KarthesischesProdukt<UndConstraint>().berechneKarthesischesProdukt(ret); ret = new KarthesischesProdukt<UndConstraint>().berechneKarthesischesProdukt(ret);
return ret; return ret;
*/
} }
@Override @Override
public String toString(){ public String toString(){
return constraintsSet.toString(); return constraintsSet.toString();
} }
*/
public void filterWrongConstraints(Unifier unify) { public void filterWrongConstraints(Unifier unify) {/*
for(OderConstraint constraint : this){ for(OderConstraint constraint : this){
constraint.filterWrongConstraints(unify); constraint.filterWrongConstraints(unify);
} }
*/
} }
/** /**
@ -54,6 +72,7 @@ public class ConstraintsSet{
* @param unifier * @param unifier
*/ */
public void unifyUndConstraints(Unifier unifier) { public void unifyUndConstraints(Unifier unifier) {
/*
Menge<UndConstraint> uCons = this.filterUndConstraints(); Menge<UndConstraint> uCons = this.filterUndConstraints();
Menge<Pair> alleUndConstraints = new Menge<>(); Menge<Pair> alleUndConstraints = new Menge<>();
for(UndConstraint undConstraint : uCons){ for(UndConstraint undConstraint : uCons){
@ -69,6 +88,7 @@ public class ConstraintsSet{
Menge<Menge<Pair>> unifyResult = unifier.apply(undConstraintsUndPairs); Menge<Menge<Pair>> unifyResult = unifier.apply(undConstraintsUndPairs);
return unifyResult; return unifyResult;
}); });
*/
} }
/** /**
@ -77,11 +97,14 @@ public class ConstraintsSet{
* @return [u1, ... , uN] * @return [u1, ... , uN]
*/ */
private Menge<UndConstraint> filterUndConstraints() { private Menge<UndConstraint> filterUndConstraints() {
/*
Menge<UndConstraint> ret = new Menge<>(); Menge<UndConstraint> ret = new Menge<>();
for(OderConstraint con : constraintsSet){ for(OderConstraint con : constraintsSet){
UndConstraint filtered = con.filterUndConstraints(); UndConstraint filtered = con.filterUndConstraints();
if(filtered != null)ret.add(filtered); if(filtered != null)ret.add(filtered);
} }
return ret; return ret;
*/
return null;
} }
} }

View File

@ -20,22 +20,24 @@ import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException;
* Die Klasse stellt ein OderConstraint-Set dar, welches nur aus einem Constraint besteht. * Die Klasse stellt ein OderConstraint-Set dar, welches nur aus einem Constraint besteht.
* *
*/ */
public class SingleConstraint extends UndConstraint{ public class SingleConstraint extends EinzelElement<Pair>{
private Pair constraintPair; //entspricht θ condition θ' //private Pair constraintPair; //entspricht θ condition θ'
//private R condition; //entspricht der condition (R) //private R condition; //entspricht der condition (R)
public SingleConstraint(ConstraintType p1, ConstraintType p2){ public SingleConstraint(ConstraintType p1, ConstraintType p2){
super(new ConstraintPair(p1,p2).getPair());
//super(p1,p2); //super(p1,p2);
ConstraintPair constraintPair = new ConstraintPair(p1,p2);//super.getConstraintPairs().firstElement(); //ConstraintPair constraintPair = new ConstraintPair(p1,p2);//super.getConstraintPairs().firstElement();
this.addConstraint(constraintPair); //this.addConstraint(constraintPair);
} }
public SingleConstraint(ConstraintPair toAdd) { public SingleConstraint(ConstraintPair toAdd) {
this.addConstraint(toAdd); super(toAdd.getPair());
//this.addConstraint(toAdd);
} }
public Pair getPair(){ public Pair getPair(){
return constraintPair; return this.getItems().firstElement();
} }
/* /*
@ -48,12 +50,12 @@ public class SingleConstraint extends UndConstraint{
*/ */
public void addConstraint(ConstraintPair toAdd){ public void addConstraint(ConstraintPair toAdd){
if(constraintPair != null)throw new DebugException("Ein Constraint darf nur aus einem ConstraintPair bestehen. Das hinzufügen von "+ toAdd + " ist nicht möglich."); //if(constraintPair != null)throw new DebugException("Ein Constraint darf nur aus einem ConstraintPair bestehen. Das hinzufügen von "+ toAdd + " ist nicht möglich.");
Type p1 = toAdd.getPair().TA1; Type p1 = toAdd.getPair().TA1;
Type p2 = toAdd.getPair().TA2; Type p2 = toAdd.getPair().TA2;
if(p1==null || p2 == null)throw new NullPointerException(); if(p1==null || p2 == null)throw new NullPointerException();
this.addItem(toAdd.getPair());
//Hier werden die GTVs zu TPH gewandelt. //Hier werden die GTVs zu TPH gewandelt.
//if(p1 instanceof RefType)((RefType)p1).GTV2TPH(); //if(p1 instanceof RefType)((RefType)p1).GTV2TPH();
@ -73,11 +75,13 @@ public class SingleConstraint extends UndConstraint{
//if(!(p1 instanceof RefType) && !(p1 instanceof TypePlaceholder))throw new DebugException("Fehler: "+p2+" kann nicht in TPH oder RefType umgewandelt werden"); //if(!(p1 instanceof RefType) && !(p1 instanceof TypePlaceholder))throw new DebugException("Fehler: "+p2+" kann nicht in TPH oder RefType umgewandelt werden");
//if(!(p2 instanceof RefType) && !(p2 instanceof TypePlaceholder))throw new DebugException("Fehler: "+p2+" kann nicht in TPH oder RefType umgewandelt werden"); //if(!(p2 instanceof RefType) && !(p2 instanceof TypePlaceholder))throw new DebugException("Fehler: "+p2+" kann nicht in TPH oder RefType umgewandelt werden");
constraintPair = new Pair(p1,p2); //constraintPair = new Pair(p1,p2);
} }
/*
@Override @Override
public String toString(){ public String toString(){
return ""+constraintPair.TA1.toString()+" < "+constraintPair.TA2.toString(); return ""+constraintPair.TA1.toString()+" < "+constraintPair.TA2.toString();
} }
*/
} }

View File

@ -11,10 +11,11 @@ import de.dhbwstuttgart.typeinference.unify.Unifier;
* @author janulrich * @author janulrich
* *
*/ */
public class UndConstraint extends OderConstraint implements Iterable<Pair>{ public class UndConstraint extends UndMenge<Pair> implements Iterable<Pair>{
public UndConstraint(ConstraintType p1, ConstraintType p2) { public UndConstraint(ConstraintType p1, ConstraintType p2) {
super(p1, p2); //super(p1, p2);
this.addItem(new SingleConstraint(p1,p2).getPair());
} }
public UndConstraint() { public UndConstraint() {
@ -41,6 +42,7 @@ public class UndConstraint extends OderConstraint implements Iterable<Pair>{
return ret+"]"; return ret+"]";
} }
/*
@Override @Override
void filterWrongConstraints(Unifier unifier) { void filterWrongConstraints(Unifier unifier) {
//In einem UndConstraint gibt es keine falschen Constraints //In einem UndConstraint gibt es keine falschen Constraints
@ -50,9 +52,14 @@ public class UndConstraint extends OderConstraint implements Iterable<Pair>{
UndConstraint filterUndConstraints(){ UndConstraint filterUndConstraints(){
return this; return this;
} }
*/
@Override @Override
public Iterator<Pair> iterator() { public Iterator<Pair> iterator() {
return this.getItems().iterator(); return this.getItems().iterator();
} }
public void addConstraint(ConstraintType type, ConstraintType type2) {
this.addItem(new ConstraintPair(type,type2).getPair());
}
} }

View File

@ -17,7 +17,7 @@ import de.dhbwstuttgart.typeinference.Pair;
*/ */
// ino.end // ino.end
// ino.class.CSubstitutionSet.27471.declaration // ino.class.CSubstitutionSet.27471.declaration
public class CSubstitutionSet extends CMengeSet<CSubstitution> public class CSubstitutionSet extends CVectorSet<CSubstitution>
// ino.end // ino.end
// ino.class.CSubstitutionSet.27471.body // ino.class.CSubstitutionSet.27471.body
{ {

View File

@ -14,7 +14,7 @@ import de.dhbwstuttgart.typeinference.Menge;
*/ */
// ino.end // ino.end
// ino.class.CMengeSet.27519.declaration // ino.class.CMengeSet.27519.declaration
public abstract class CMengeSet<E> extends CSet<E> public abstract class CVectorSet<E> extends CSet<E>
// ino.end // ino.end
// ino.class.CMengeSet.27519.body // ino.class.CMengeSet.27519.body
{ {
@ -23,7 +23,7 @@ public abstract class CMengeSet<E> extends CSet<E>
// ino.end // ino.end
// ino.method.CMengeSet.27526.definition // ino.method.CMengeSet.27526.definition
public CMengeSet() public CVectorSet()
// ino.end // ino.end
// ino.method.CMengeSet.27526.body // ino.method.CMengeSet.27526.body
{ {
@ -49,7 +49,7 @@ public abstract class CMengeSet<E> extends CSet<E>
} }
// ino.end // ino.end
public void addAll( CMengeSet<E> set ) public void addAll( CVectorSet<E> set )
{ {
for( int i=0;i<set.getCardinality(); i++ ){ for( int i=0;i<set.getCardinality(); i++ ){
m_Elements.addElement(set.m_Elements.elementAt(i)); m_Elements.addElement(set.m_Elements.elementAt(i));
@ -94,10 +94,10 @@ public abstract class CMengeSet<E> extends CSet<E>
// ino.end // ino.end
// ino.method.unite.27544.body // ino.method.unite.27544.body
{ {
if(!(anotherSet instanceof CMengeSet)){ if(!(anotherSet instanceof CVectorSet)){
return; return;
} }
CMengeSet<E> MengeSet = (CMengeSet<E>)anotherSet; CVectorSet<E> MengeSet = (CVectorSet<E>)anotherSet;
// Elemente der anderen Menge hinzuf<EFBFBD>gen: // Elemente der anderen Menge hinzuf<EFBFBD>gen:
Iterator<E> it = MengeSet.getIterator(); Iterator<E> it = MengeSet.getIterator();
@ -116,10 +116,10 @@ public abstract class CMengeSet<E> extends CSet<E>
// ino.end // ino.end
// ino.method.subtract.27547.body // ino.method.subtract.27547.body
{ {
if(!(anotherSet instanceof CMengeSet)){ if(!(anotherSet instanceof CVectorSet)){
return; return;
} }
CMengeSet<E> MengeSet = (CMengeSet<E>)anotherSet; CVectorSet<E> MengeSet = (CVectorSet<E>)anotherSet;
// Elemente der anderen Menge entfernen: // Elemente der anderen Menge entfernen:
m_Elements.removeAll(MengeSet.m_Elements); m_Elements.removeAll(MengeSet.m_Elements);
@ -140,8 +140,8 @@ public abstract class CMengeSet<E> extends CSet<E>
// ino.end // ino.end
// ino.method.equals.27553.body // ino.method.equals.27553.body
{ {
if(obj instanceof CMengeSet){ if(obj instanceof CVectorSet){
CMengeSet tripSet= (CMengeSet)obj; CVectorSet tripSet= (CVectorSet)obj;
boolean ret = true; boolean ret = true;
ret &= (m_Elements.containsAll(tripSet.m_Elements)); ret &= (m_Elements.containsAll(tripSet.m_Elements));
ret &= (tripSet.m_Elements.containsAll(m_Elements)); ret &= (tripSet.m_Elements.containsAll(m_Elements));

View File

@ -1,8 +1,8 @@
import de.dhbwstuttgart.typeinference.Menge; import de.dhbwstuttgart.typeinference.Vector;
class ImportGeneric { class ImportGeneric {
m (Menge<Integer> x) { m (Vector<Integer> x) {
return x.elementAt(1); return x.elementAt(1);
} }
} }