forked from JavaTX/JavaCompilerCore
Unify auf commit 144c31a4cb
ändern
This commit is contained in:
parent
61891177a1
commit
b8c0d87056
@ -6,25 +6,11 @@ package de.dhbwstuttgart.typeinference.unify;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import de.dhbwstuttgart.typeinference.Menge;
|
||||
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.collect.Sets.SetView;
|
||||
import com.rits.cloning.Cloner;
|
||||
|
||||
import de.dhbwstuttgart.logger.Logger;
|
||||
import de.dhbwstuttgart.logger.Section;
|
||||
import de.dhbwstuttgart.logger.SectionLogger;
|
||||
import de.dhbwstuttgart.logger.Timestamp;
|
||||
import de.dhbwstuttgart.logger.Timewatch;
|
||||
import de.dhbwstuttgart.core.MyCompiler;
|
||||
import de.dhbwstuttgart.myexception.CTypeReconstructionException;
|
||||
import de.dhbwstuttgart.myexception.MatchException;
|
||||
@ -44,19 +30,16 @@ import de.dhbwstuttgart.syntaxtree.type.Type;
|
||||
import de.dhbwstuttgart.syntaxtree.type.ObjectType;
|
||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||
import de.dhbwstuttgart.syntaxtree.type.WildcardType;
|
||||
import de.dhbwstuttgart.typeinference.ConstraintsSet;
|
||||
import de.dhbwstuttgart.typeinference.DeepCloneable;
|
||||
import de.dhbwstuttgart.typeinference.OderConstraint;
|
||||
import de.dhbwstuttgart.typeinference.Menge;
|
||||
import de.dhbwstuttgart.typeinference.Pair;
|
||||
import de.dhbwstuttgart.typeinference.Pair.PairOperator;
|
||||
import de.dhbwstuttgart.typeinference.UndConstraint;
|
||||
|
||||
// ino.end
|
||||
|
||||
// ino.class.Unify.28049.description type=javadoc
|
||||
/**
|
||||
* Implementierung des Unifizierungsalgorithmus
|
||||
* @author Martin Pl�micke, Thomas Ott
|
||||
* @author Martin Pl<EFBFBD>micke, Thomas Ott
|
||||
* @version $Date: 2013/05/22 22:23:50 $
|
||||
*/
|
||||
// ino.end
|
||||
@ -67,7 +50,7 @@ public class Unify
|
||||
{
|
||||
|
||||
// ino.attribute.inferencelog.28052.declaration
|
||||
protected static SectionLogger inferencelog = Logger.getSectionLogger(Unify.class.getName(), Section.UNIFY);
|
||||
protected static SectionLogger inferencelog = Logger.getSectionLogger("inference", Section.UNIFY);
|
||||
// ino.end
|
||||
|
||||
/**
|
||||
@ -126,21 +109,13 @@ public class Unify
|
||||
* Entweder alle Elemente in solved Form [A =. type, B =. type2, ...]
|
||||
* oder alle Elemente in der Form [A <. B, C <. D, ..., E <? F, G <? H, .... I =. type, J =. type2, ...]
|
||||
* oder [] = fail
|
||||
* Für den Argumenttype FunN<...> in Typ A<FunN<...> ...> werden keine ? extends-, ? super-Typen erzeugt
|
||||
* F<EFBFBD>r den Argumenttype FunN<...> in Typ A<FunN<...> ...> werden keine ? extends-, ? super-Typen erzeugt
|
||||
*/
|
||||
//public static Menge<Menge<Pair>> unifyWC (Menge<Pair> E, FC_TTO fc_tto)
|
||||
public static Menge<Menge<Pair>> unify (Menge<Pair> E, FC_TTO fc_tto)
|
||||
{
|
||||
return unifyFiltered(E, fc_tto,true);
|
||||
}
|
||||
|
||||
//public static Menge<Menge<Pair>> unifyWC (Menge<Pair> E, FC_TTO fc_tto)
|
||||
public static Menge<Menge<Pair>> unifyFiltered (Menge<Pair> E, FC_TTO fc_tto, boolean filter)
|
||||
{
|
||||
SectionLogger log = Logger.getSectionLogger(Unify.class.getName(), Section.UNIFY);
|
||||
|
||||
//Schritt 1: Aufrufen der Regeln durch sub_unify.
|
||||
Menge<Pair> Eq = sub_unify(E,fc_tto);
|
||||
log.debug("Eq Set nach Schritt 1: "+Eq);
|
||||
/* Schritt 2: Rausfiltern der Typen die entweder beides Typvariablen sind oder nicht.
|
||||
* Sobald ein Paar auftauch, bei denen kein Typ mehr eine Typvariable ist, kann dieses Paar
|
||||
* nicht mehr unifiziert werden, deshalb abbruch.*/
|
||||
@ -153,7 +128,7 @@ public class Unify
|
||||
}
|
||||
else if(!(p.TA1 instanceof TypePlaceholder) && !(p.TA2 instanceof TypePlaceholder))
|
||||
{
|
||||
//Diese Paare können nicht mehr Unifiziert werden. fail.
|
||||
//Diese Paare k<EFBFBD>nnen nicht mehr Unifiziert werden. fail.
|
||||
inferencelog.debug("UNIFY FAIL:" + p.TA1 + " <. " + p.TA2 + " muesste mindestens einen TPH enthalten.");
|
||||
return new Menge<Menge<Pair>>();
|
||||
}
|
||||
@ -165,8 +140,8 @@ public class Unify
|
||||
if(!Eq1.contains(p))
|
||||
Eq2.add(p);
|
||||
}
|
||||
/* Schritt 4, Teil 1: Einsammeln der Sets für das Kartesiche Produkt.
|
||||
* Hier werden die Paare verglichen. Je nach Struktur können neue Paare erzeugt
|
||||
/* Schritt 4, Teil 1: Einsammeln der Sets f<EFBFBD>r das Kartesiche Produkt.
|
||||
* Hier werden die Paare verglichen. Je nach Struktur k<EFBFBD>nnen neue Paare erzeugt
|
||||
* werden, aus denen dann das kartesische Produkt gebildet wird.*/
|
||||
Menge<Menge<Menge<Pair>>> cartProduktSets = new Menge<Menge<Menge<Pair>>>();
|
||||
for(Pair p : Eq2)
|
||||
@ -178,7 +153,7 @@ public class Unify
|
||||
p.TA2 = ((SuperWildcardType)p.TA2).get_SuperType();
|
||||
//HIER GIBT ES EIN PROBLEM, WENN get_SuperType ein TPH LIEFERT PL 15-03-12
|
||||
//Dann ist THP <. TPH in Eq2 anstatt in Eq1
|
||||
//Muesste mit folgendem if gelöst sein. PL 15-03-17
|
||||
//Muesste mit folgendem if gel<EFBFBD>st sein. PL 15-03-17
|
||||
if (p.TA2 instanceof TypePlaceholder) {
|
||||
Eq1.addElement(p);
|
||||
// Eq2.remove(p);
|
||||
@ -229,7 +204,7 @@ public class Unify
|
||||
unifyErgs.add(unifyErgsElement.firstElement());
|
||||
}
|
||||
}
|
||||
// Nach dem Unifizieren wird das Ergebnis überprüft, und evtl. durch die FC entstandene TPHs werden gelöscht.
|
||||
// Nach dem Unifizieren wird das Ergebnis <EFBFBD>berpr<EFBFBD>ft, und evtl. durch die FC entstandene TPHs werden gel<EFBFBD>scht.
|
||||
if((p_fc.TA2 instanceof RefType && !unifyErgs.isEmpty())
|
||||
|| p_fc.TA2.equals(p_TA2)) //Bedingung fuer Reflexifitaet BRAURHT MAN VERMUTLIRH NIRHT PL 07-08-05
|
||||
{
|
||||
@ -328,7 +303,7 @@ public class Unify
|
||||
}
|
||||
else if(p.OperatorSmaller() && p.TA2 instanceof GenericTypeVar)
|
||||
{
|
||||
//Paar unverändert lassen, wenn eine GenericTypeVar ist
|
||||
//Paar unver<EFBFBD>ndert lassen, wenn eine GenericTypeVar ist
|
||||
Menge<Menge<Pair>> setofsetofpairs = new Menge<Menge<Pair>>();
|
||||
Menge<Pair> vTmp = new Menge<Pair>();
|
||||
vTmp.add(p);
|
||||
@ -370,7 +345,7 @@ public class Unify
|
||||
unifyErgs.add(unifyErgsElement.firstElement());
|
||||
}
|
||||
}
|
||||
//Nach dem Unifizieren wird das Ergebnis überprüft, und evtl. durch die FC entstandene TPHs werden gelöscht.
|
||||
//Nach dem Unifizieren wird das Ergebnis <EFBFBD>berpr<EFBFBD>ft, und evtl. durch die FC entstandene TPHs werden gel<EFBFBD>scht.
|
||||
if((p_fc.TA2 instanceof RefType && !unifyErgs.isEmpty())
|
||||
|| p_fc.TA2.equals(p_TA2)) //Bedingung fuer Reflexifitaet BRAURHT MAN VERMUTLIRH NIRHT PL 07-08-05
|
||||
{
|
||||
@ -545,7 +520,7 @@ public class Unify
|
||||
unifyErgs.add(unifyErgsElement.firstElement());
|
||||
}
|
||||
}
|
||||
// Nach dem Unifizieren wird das Ergebnis überprüft, und evtl. durch die FC entstandene TPHs werden gelöscht.
|
||||
// Nach dem Unifizieren wird das Ergebnis <EFBFBD>berpr<EFBFBD>ft, und evtl. durch die FC entstandene TPHs werden gel<EFBFBD>scht.
|
||||
if((p_fc.TA2 instanceof RefType && !unifyErgs.isEmpty())
|
||||
|| p_fc.TA2.equals(p_TA1)) //Bedingung fuer Reflexifitaet BRAURHT MAN VERMUTLIRH NIRHT PL 07-08-05
|
||||
{
|
||||
@ -644,91 +619,8 @@ public class Unify
|
||||
}
|
||||
}
|
||||
//Schritt 4, Teil 2: Kartesisches Produkt bilden.
|
||||
log.debug("Unify Sets nach Schritt 4 vor dem Erstellen des Karthesischen Produkts: "+cartProduktSets);
|
||||
/*
|
||||
//TODO: Vor der Bildung des Karthesischen Produkts unmögliche Kombinationen ausfiltern
|
||||
//cartProduktSets kontrollieren:
|
||||
ConstraintsSet cSet = new ConstraintsSet();
|
||||
UndConstraint eq1cons = new UndConstraint();
|
||||
for(Pair p : Eq1){
|
||||
eq1cons.addConstraint(p.TA1, p.TA2);
|
||||
}
|
||||
cSet.add(eq1cons);
|
||||
for(Menge<Menge<Pair>> vecvecpair : cartProduktSets){
|
||||
OderConstraint orConstraints = new OderConstraint();
|
||||
for(Menge<Pair> pairs : vecvecpair){
|
||||
UndConstraint uCons = new UndConstraint();
|
||||
for(Pair p : pairs){
|
||||
uCons.addConstraint(p.TA1, p.TA2);
|
||||
}
|
||||
orConstraints.addConstraint(uCons);
|
||||
}
|
||||
cSet.add(orConstraints);
|
||||
}
|
||||
|
||||
Menge<Menge<Pair>> bigCartProductErg3 = cSet.cartesianProduct();
|
||||
if(filter)log.debug("Karthesisches Produkt nach Filterung: "+bigCartProductErg3);
|
||||
Sets.cartesianProduct(bigCartProductErg3);
|
||||
*/
|
||||
|
||||
if(filter){
|
||||
//Cloner cloner = new Cloner();
|
||||
Menge<Menge<Menge<Pair>>> temp = new Menge<>(); //hier werden gefilterte Constraints gesammelt
|
||||
Menge<Pair> undMenge = new Menge<Pair>(); //Die Menge von Pairs, welche in jedem Kartesischen Produkt enthalten sind.
|
||||
//undMenge.addAll(cloner.deepClone(Eq1));
|
||||
undMenge.addAll(Unify.deepClone(Eq1));
|
||||
Menge<Menge<Menge<Pair>>> oderConstraints = new Menge<>();//Die zu filternden Constraints
|
||||
for (Menge<Menge<Pair>> vecvecpair : cartProduktSets){
|
||||
if(vecvecpair.size() == 1){//gibt es nur eine UndMenge in diesem Set, dann kommt diese in jedem Karthesischen Produkt vor:
|
||||
//undMenge.addAll(cloner.deepClone(vecvecpair.firstElement()));
|
||||
undMenge.addAll(Unify.deepClone(vecvecpair.firstElement()));
|
||||
temp.add(vecvecpair);
|
||||
}else{//gibt es mehrere Mengen, kann gefiltert werden:
|
||||
oderConstraints.add(vecvecpair); //die Menge zu den zu filternden OderConstraints anfügen
|
||||
}
|
||||
}
|
||||
//Filtere die OderConstraints:
|
||||
for(Menge<Menge<Pair>> oderConstraint : oderConstraints){
|
||||
Menge<Menge<Pair>> filteredOCons = new Menge<>(); //diese Menge sammelt nur Cons
|
||||
for(Menge<Pair> pairs : oderConstraint){
|
||||
Menge<Pair> testMenge = new Menge<Pair>();
|
||||
//testMenge.addAll(cloner.deepClone(undMenge));
|
||||
//testMenge.addAll(cloner.deepClone(pairs));
|
||||
testMenge.addAll(Unify.deepClone(undMenge));
|
||||
testMenge.addAll(Unify.deepClone(pairs));
|
||||
Menge<Menge<Pair>> test = Unify.unifyFiltered(testMenge, fc_tto, false);
|
||||
if(test.size()>0){
|
||||
filteredOCons.add(pairs);
|
||||
}
|
||||
else{
|
||||
log.debug("Ausgesondertes Constraint: "+pairs);
|
||||
}
|
||||
}
|
||||
temp.add(filteredOCons);
|
||||
}
|
||||
SetView<Menge<Menge<Pair>>> difference = Sets.difference(cartProduktSets, temp);
|
||||
log.debug("Ausgelöschte Constraints: "+difference.toString());
|
||||
cartProduktSets = temp;
|
||||
/*
|
||||
Unifier filterUnify = (pairs)->{
|
||||
String pairsString = pairs.toString();
|
||||
Menge<Menge<Pair>> retValue = new Menge<>();
|
||||
retValue = Unify.unifyFiltered(pairs,fc_tto,false);
|
||||
//Unify.unify(pairs, fc_tto, (i)->{});
|
||||
log.debug("Filtere Constraints:\n"+pairsString);
|
||||
log.debug("Ergebnis: "+ retValue);
|
||||
return retValue;
|
||||
};
|
||||
|
||||
log.debug("Filtere mithilfe von 'filterWrongConstraints': "+cSet);
|
||||
cSet.filterWrongConstraints(filterUnify);
|
||||
*/
|
||||
}
|
||||
|
||||
//*/
|
||||
|
||||
///* Altes Karthesisches Produkt: Auskommentiert durch Andreas Stadelmeier
|
||||
//Hier wird aus den in Schritt 4, Teil 1 erzeugten Vektoren das Kartesische Produkt gebildet.
|
||||
//TODO: Vor der Bildung des Karthesischen Produkts unm<EFBFBD>gliche Kombinationen ausfiltern
|
||||
//Hier wird aus den in Schritt 4, Teil 1 erzeugten Vektoren das Kartesische Produkt gebilden.
|
||||
Menge<Pair> helpvp;
|
||||
Menge<Menge<Pair>> bigCartProductErg = new Menge<Menge<Pair>>();
|
||||
bigCartProductErg.addElement(copyMengePair(Eq1));
|
||||
@ -747,33 +639,13 @@ public class Unify
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if(! bigCartProductErg.equals(bigCartProductErg3)){
|
||||
for(int i = 0; i<bigCartProductErg3.size();i++){
|
||||
if(! (bigCartProductErg.get(i).equals(bigCartProductErg3.get(i)))){
|
||||
System.out.println();
|
||||
//TODO: Hier testen, wo der Unterschied zwischen den beiden Karthesischen Produkten ist
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
//*/
|
||||
|
||||
//Schritt 5: Einsetzen der Subst Regel
|
||||
//Hier werden die TPHs substituiert, und dann nach geänderten und nicht geänderten Sets sortiert.
|
||||
//Hier werden die TPHs substituiert, und dann nach ge<EFBFBD>nderten und nicht ge<EFBFBD>nderten Sets sortiert.
|
||||
Menge<Menge<Pair>> changedSets = new Menge<Menge<Pair>>();
|
||||
Menge<Menge<Pair>> notChangedSets = new Menge<Menge<Pair>>();
|
||||
int counter = 0;
|
||||
for(Menge<Pair> vecpair : bigCartProductErg)
|
||||
{
|
||||
//Klone die Menge vecpair, bevor substituiert wird. Viele Paare sind doppelt referenziert und müssen vor dem Substituieren geklont werden
|
||||
vecpair = vecpair.stream().map(x -> x.clone()).collect(Menge::new, Menge::add, Menge::addAll);
|
||||
|
||||
counter++;
|
||||
if(counter > 1000){
|
||||
System.out.println(counter + " von "+bigCartProductErg.size());
|
||||
}
|
||||
boolean change = false; //eingefuegt PL 13-05-22
|
||||
Pair substPair = null;
|
||||
do
|
||||
@ -823,29 +695,29 @@ public class Unify
|
||||
}
|
||||
}
|
||||
|
||||
//Eq2Set ist das eigentliche Ergebnis, dass zurückgegeben wird.
|
||||
//Eq2Set ist das eigentliche Ergebnis, dass zur<EFBFBD>ckgegeben wird.
|
||||
Menge<Menge<Pair>> Eq2Set = new Menge<Menge<Pair>>();
|
||||
|
||||
//Schritt 6A: Beginnen mit Schritt 1 bei den geänderten.
|
||||
//Schritt 6A: Beginnen mit Schritt 1 bei den ge<EFBFBD>nderten.
|
||||
for(Menge<Pair> vecpair : changedSets)
|
||||
{
|
||||
Menge<Menge<Pair>> unifyErgs = unify(vecpair,fc_tto);
|
||||
//Die Ergebnissvektoren sind schon im Schritt 7 von dem Rekursiven Aufruf geprüft worden. Sie können direkt eingefügt werden.
|
||||
//Die Ergebnissvektoren sind schon im Schritt 7 von dem Rekursiven Aufruf gepr<EFBFBD>ft worden. Sie k<EFBFBD>nnen direkt eingef<EFBFBD>gt werden.
|
||||
Eq2Set.addAll(unifyErgs);
|
||||
}
|
||||
|
||||
//Schritt 6B Einfügen der nicht geänderten.
|
||||
//Schritt 6B Einf<EFBFBD>gen der nicht ge<EFBFBD>nderten.
|
||||
//Schritt 7: Aussortieren der falschen Sets
|
||||
/*
|
||||
* Durch die Rekursion in Schritt 6A sind die Ergebnisse, welche in 6A dazukommen auf jeden Fall korrekt.
|
||||
* Es müssen nur die Ergebnisse aus 6B geprüft werden.
|
||||
* Es m<EFBFBD>ssen nur die Ergebnisse aus 6B gepr<EFBFBD>ft werden.
|
||||
*/
|
||||
for(Menge<Pair> vecpair : notChangedSets)
|
||||
{
|
||||
//Ãberprüfen ob Menge in SolvedForm ist.
|
||||
//<EFBFBD>berpr<EFBFBD>fen ob Menge in SolvedForm ist.
|
||||
if(hasSolvedForm(vecpair)) //PL 13-05-22 hasSolvedForm angepasst
|
||||
{
|
||||
//Ãberprüfung auf FreshTypeVars in den Typen
|
||||
//<EFBFBD>berpr<EFBFBD>fung auf FreshTypeVars in den Typen
|
||||
boolean foundFresh = false;
|
||||
for(Pair p : vecpair)
|
||||
{
|
||||
@ -863,14 +735,14 @@ public class Unify
|
||||
}
|
||||
}
|
||||
|
||||
//Ergebnis zurückgeben.
|
||||
//Ergebnis zur<EFBFBD>ckgeben.
|
||||
return Eq2Set;
|
||||
}
|
||||
|
||||
/**
|
||||
* PL 2014-10-25
|
||||
* schnitt1 checkt ob die Typeplaceholders aus in den Elemeneten aus vars enthalten sind
|
||||
* Rückgabe ist die Menge der Indizies von vars der Schnittmengen mit var nicht leer sind.
|
||||
* R<EFBFBD>ckgabe ist die Menge der Indizies von vars der Schnittmengen mit var nicht leer sind.
|
||||
* @param var
|
||||
* @param vars
|
||||
* @param indexe
|
||||
@ -921,10 +793,10 @@ public class Unify
|
||||
* Beispiel: unifyERgs = [[a = Integer, b = Number ]], test = Menge<a>
|
||||
* In diesm fall wird b = Number aus dem Menge entfernt.
|
||||
*
|
||||
* Durch das Entfernen entstehen evtl. Identische Mengeen, diese werden auch gelöscht.
|
||||
* Durch das Entfernen entstehen evtl. Identische Mengeen, diese werden auch gel<EFBFBD>scht.
|
||||
*
|
||||
* @param unifyErgs - Ergebnisse des Unify, die geprüft werden sollen.
|
||||
* @param test - RefType gegen den geprüft werden soll.
|
||||
* @param unifyErgs - Ergebnisse des Unify, die gepr<EFBFBD>ft werden sollen.
|
||||
* @param test - RefType gegen den gepr<EFBFBD>ft werden soll.
|
||||
*/
|
||||
private static void testUnifyErg(Menge<Menge<Pair>> unifyErgs, RefType test)
|
||||
{
|
||||
@ -938,7 +810,7 @@ public class Unify
|
||||
vec--;
|
||||
}
|
||||
}
|
||||
//Gleiche Mengeen löschen
|
||||
//Gleiche Mengeen l<EFBFBD>schen
|
||||
for(int i = 0; i < unifyErgs.size(); i++)
|
||||
{
|
||||
Menge<Pair> p1 = unifyErgs.elementAt(i);
|
||||
@ -967,13 +839,13 @@ public class Unify
|
||||
}
|
||||
|
||||
/**
|
||||
* Diese Methode generiert einen Menge<Menge<Pair>> wobei immer der übergebene TA1 vorne steht, und jeder Typ aus otherPairTypes hinten.
|
||||
* Diese Methode generiert einen Menge<Menge<Pair>> wobei immer der <EFBFBD>bergebene TA1 vorne steht, und jeder Typ aus otherPairTypes hinten.
|
||||
* Beispiel: otherPairTypes = [Integer, Number, Menge<Integer>], TA1 = TPH a.
|
||||
* return: [[TPH a = Integer],[TPH a = Number],[TPH a = Menge<Integer>]]
|
||||
*
|
||||
* @param TA1 - Der Typ der immer vorne steht
|
||||
* @param otherPairTypes - Die anderen Typen
|
||||
* @return - Ein Menge<Menge<Pair>> der alle Paare enthält.
|
||||
* @return - Ein Menge<Menge<Pair>> der alle Paare enth<EFBFBD>lt.
|
||||
*/
|
||||
private static Menge<Menge<Pair>> generateSetOfSetOfPair(Type TA1, Menge<? extends Type> otherPairTypes)
|
||||
{
|
||||
@ -1074,7 +946,7 @@ public class Unify
|
||||
//Menge wird geclont, Elemente nicht
|
||||
//Menge<RefType> Mub = (Menge<RefType>)ub.clone();
|
||||
|
||||
//Elemente die nicht kleinste obere Schranken sind, werden gel�scht
|
||||
//Elemente die nicht kleinste obere Schranken sind, werden gel<EFBFBD>scht
|
||||
//FUNKTIONIERT NICHT. SIEHE iftest.java PL 08-08-13
|
||||
for (int i = 0; i < ub.size(); i++) {
|
||||
for (int j = 0; j < ub.size(); j++) {
|
||||
@ -1130,7 +1002,7 @@ throws MatchException
|
||||
// ino.method.match.28064.body
|
||||
{
|
||||
//PL 05-01-22
|
||||
//gibt eine Substitution zur�ck, die den Variablen aus FCtype
|
||||
//gibt eine Substitution zur<EFBFBD>ck, die den Variablen aus FCtype
|
||||
//die Typterme aus tomatch zu ordnet. Es wird davon ausgegangen, dass
|
||||
//FCtype gegen tomatch gematcht werden kann.
|
||||
if (FCtype.getTypeName().equals(tomatch.getTypeName())) {
|
||||
@ -1174,7 +1046,7 @@ throws MatchException
|
||||
// ino.method.sub_unify.28067.body
|
||||
{
|
||||
//PL 05-01-21 umbenannt in sub_unify
|
||||
//Luar boolean useSubst hinzugefügt, um bei bedarf zu Steuern ob Subst Regel angewendet wird oder nicht.
|
||||
//Luar boolean useSubst hinzugef<EFBFBD>gt, um bei bedarf zu Steuern ob Subst Regel angewendet wird oder nicht.
|
||||
// otth: Unifikation - Versuch 1 :-)
|
||||
|
||||
//Menge FC = fc_tto.getFC();
|
||||
@ -1199,7 +1071,7 @@ throws MatchException
|
||||
inferencelog.debug("Ausgewaehltes Paar = " + P.toString() + "");
|
||||
inferencelog.debug( "--------------------------------------------------");
|
||||
|
||||
// Bei allen Erase erfolgt keine Kopie nach H, dadurch wird das Pair gelöscht.
|
||||
// Bei allen Erase erfolgt keine Kopie nach H, dadurch wird das Pair gel<EFBFBD>scht.
|
||||
//ERASE3
|
||||
if( P.isEqual() && P.OperatorEqual() )
|
||||
{
|
||||
@ -1321,13 +1193,13 @@ throws MatchException
|
||||
}
|
||||
catch( SCException Ex )
|
||||
{
|
||||
inferencelog.debug("---- Unifikation nicht m�glich: Permutation fehlgeschlagen!");
|
||||
inferencelog.debug("---- Unifikation nicht m<EFBFBD>glich: Permutation fehlgeschlagen!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
inferencelog.info("---- Unifikation nicht m�glich: Anzahl der Parameter verschieden!");
|
||||
inferencelog.info("---- Unifikation nicht m<EFBFBD>glich: Anzahl der Parameter verschieden!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1378,13 +1250,13 @@ throws MatchException
|
||||
}
|
||||
catch( SCException Ex )
|
||||
{
|
||||
inferencelog.debug("---- Unifikation nicht m�glich: Permutation fehlgeschlagen!");
|
||||
inferencelog.debug("---- Unifikation nicht m<EFBFBD>glich: Permutation fehlgeschlagen!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
inferencelog.info("---- Unifikation nicht m�glich: Anzahl der Parameter verschieden!");
|
||||
inferencelog.info("---- Unifikation nicht m<EFBFBD>glich: Anzahl der Parameter verschieden!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1455,7 +1327,7 @@ throws MatchException
|
||||
|
||||
RefType TA1 = null;
|
||||
RefType TA2 = null;
|
||||
//Hier werden die RefTypes gefüllt.
|
||||
//Hier werden die RefTypes gef<EFBFBD>llt.
|
||||
if(P.TA1 instanceof RefType && P.TA2 instanceof RefType)
|
||||
{
|
||||
TA1 = (RefType)P.TA1;
|
||||
@ -1477,7 +1349,7 @@ throws MatchException
|
||||
}
|
||||
catch( SCException Ex )
|
||||
{
|
||||
inferencelog.error("---- Unifikation nicht m�glich: Permutation fehlgeschlagen!");
|
||||
inferencelog.error("---- Unifikation nicht m<EFBFBD>glich: Permutation fehlgeschlagen!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1510,7 +1382,7 @@ throws MatchException
|
||||
}
|
||||
catch( SCException Ex )
|
||||
{
|
||||
inferencelog.debug("---- Unifikation nicht m�glich: Permutation fehlgeschlagen!");
|
||||
inferencelog.debug("---- Unifikation nicht m<EFBFBD>glich: Permutation fehlgeschlagen!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1530,7 +1402,7 @@ throws MatchException
|
||||
}
|
||||
catch( SCException Ex )
|
||||
{
|
||||
inferencelog.error("---- Unifikation nicht m�glich: Permutation fehlgeschlagen!");
|
||||
inferencelog.error("---- Unifikation nicht m<EFBFBD>glich: Permutation fehlgeschlagen!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1643,7 +1515,7 @@ throws MatchException
|
||||
|
||||
}
|
||||
|
||||
// Subst --> noch zu pr�fen
|
||||
// Subst --> noch zu pr<EFBFBD>fen
|
||||
if( P.TA1 instanceof TypePlaceholder && P.OperatorEqual() && useSubst) //&& P.TA2 instanceof RefType )
|
||||
//PL 05-02-09 P.TA@ duerfen auch TypePlaceholder sein
|
||||
/* BEISPIEL:
|
||||
@ -1797,7 +1669,7 @@ throws MatchException
|
||||
|
||||
/**
|
||||
* Implementiert die reduceEq Regel des sub_unify
|
||||
* Da in reduce2 unnötigerweise pi verwendet wird (siehe Kommentar in reduce2), kann reduceEq einfach an reduce2 deligieren.
|
||||
* Da in reduce2 unn<EFBFBD>tigerweise pi verwendet wird (siehe Kommentar in reduce2), kann reduceEq einfach an reduce2 deligieren.
|
||||
*/
|
||||
private static void reduceEq(Menge<Pair> H, RefType TA1, RefType TA2, Menge TTO) throws SCException
|
||||
{
|
||||
@ -1819,11 +1691,11 @@ throws MatchException
|
||||
inferencelog.debug("---- Parameteranzahl gleich");
|
||||
inferencelog.debug("---- Reduce !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (" + L1.size() + ") neue(s) Paar(e)");
|
||||
|
||||
// hier mu� die PERMUTATION erfolgen
|
||||
// hier mu<EFBFBD> die PERMUTATION erfolgen
|
||||
inferencelog.debug("---- PAARBILDUNG ");
|
||||
for( int k = 0; k < L1.size(); k++ )
|
||||
{
|
||||
// pi eig. bei reduce2 �berfl�ssig, schadet aber hoff. auch nicht :-)
|
||||
// pi eig. bei reduce2 <EFBFBD>berfl<EFBFBD>ssig, schadet aber hoff. auch nicht :-)
|
||||
//luar 19-04-2007 durch das pi kann reduce2 auch als reduceEq verwendet werden. Wenn das pi durch k ersetzt wird, muss reduceEq entsprechend ausprogrammiert werden.
|
||||
Pair P2 = new Pair( L1.elementAt( pi(k, TA1.getTypeName(), TA2.getTypeName(), TTO ) ), L2.elementAt(k), PairOperator.Equal );
|
||||
inferencelog.debug("---- Paar1: (" + (L1.elementAt( pi(k, TA1.getTypeName(), TA2.getTypeName(), TTO ) )).getName() + ", " + (L2.elementAt(k)).getName() + P2.OperatorEqual() + ")");
|
||||
@ -2122,7 +1994,7 @@ throws MatchException
|
||||
//LIEGT
|
||||
//erlegigt 06-04-28
|
||||
Menge<Pair> res = sub_unify(subunifypair, fc_tto);
|
||||
if (hasSolvedForm(res)) { //PL 13-05-22: hasSolvedForm geaendert, es nicht geklärt, ob es funktioniert.
|
||||
if (hasSolvedForm(res)) { //PL 13-05-22: hasSolvedForm geaendert, es nicht gekl<EFBFBD>rt, ob es funktioniert.
|
||||
inferencelog.debug("HasSolvedForm: ");
|
||||
printMenge("RES_SMALLER", res, 6);
|
||||
ht = MengePair2SubstHashtableMengePair(res);
|
||||
@ -2237,27 +2109,6 @@ throws MatchException
|
||||
return ret;
|
||||
}
|
||||
// ino.end
|
||||
|
||||
/*
|
||||
// ino.method.allGreater.29428.definition
|
||||
public static Menge<RefType> allGreater (BoundedGenericTypeVar ty, Menge<Pair> FC)
|
||||
// ino.end
|
||||
// ino.method.allGreater.29428.body
|
||||
{
|
||||
CRefTypeSet ret = new CRefTypeSet();
|
||||
Iterator<ObjectType> typeIt = ty.getBounds().iterator();
|
||||
while(typeIt.hasNext()) {
|
||||
CRefTypeSet grBounds = new CRefTypeSet();
|
||||
RefType act = (RefType)typeIt.next();
|
||||
grBounds.setMenge(allGreater(act, FC));
|
||||
grBounds.addElement(act);
|
||||
ret.unite(grBounds);
|
||||
}
|
||||
return ret.getMenge();
|
||||
}
|
||||
// ino.end
|
||||
*/
|
||||
|
||||
// ino.method.allGreater.28094.definition
|
||||
public static Menge<RefType> allGreater (RefType ty, Menge<Pair> FC)
|
||||
// ino.end
|
||||
@ -2305,7 +2156,7 @@ throws MatchException
|
||||
{
|
||||
// otth: Funktion, die prueft, ob Paar( R1, R2 ) in FC liegt,
|
||||
// bzw. deren rechten Seiten, ohne die TypePlaceholder-Variablen zu beachten
|
||||
// z.B. Menge<A> w�re hier gleich wie Menge<Integer>
|
||||
// z.B. Menge<A> w<EFBFBD>re hier gleich wie Menge<Integer>
|
||||
|
||||
// z.B. FC = { ( AA<a, b> <=* CC< DD<b, a> > ) ,...}
|
||||
// R1 = AA<Integer, b>
|
||||
@ -2353,7 +2204,7 @@ throws MatchException
|
||||
{
|
||||
// otth: Funktion, die prueft, ob Paar( R1, \sigma(R2) ) in FC liegt,
|
||||
// bzw. deren rechten Seiten, ohne die TypePlaceholders zu beachten
|
||||
// z.B. Menge<A> w�re hier gleich wie Menge<Integer>
|
||||
// z.B. Menge<A> w<EFBFBD>re hier gleich wie Menge<Integer>
|
||||
|
||||
// z.B. FC = { ( AA<a, b> <=* CC< DD<b, a> > ) ,...}
|
||||
// R1 = AA<Integer, b>
|
||||
@ -2391,7 +2242,7 @@ throws MatchException
|
||||
Menge<Pair> vp = sub_unify(R2vec, fc_tto);
|
||||
|
||||
printMenge("VP", vp, 6);
|
||||
if ( hasSolvedForm(vp) ) //PL 13-05-22: hasSolvedForm geaendert, es nicht geklärt, ob es funktioniert.
|
||||
if ( hasSolvedForm(vp) ) //PL 13-05-22: hasSolvedForm geaendert, es nicht gekl<EFBFBD>rt, ob es funktioniert.
|
||||
//if( isRXSimilarRY( RFC, R2 ) )
|
||||
{
|
||||
inferencelog.debug("SIMILAR2");
|
||||
@ -2476,19 +2327,7 @@ throws MatchException
|
||||
inferencelog.debug("Nummer: " + nTypnrInPair);
|
||||
inferencelog.debug("TV: " + a.getName());
|
||||
inferencelog.debug("Bedingung: " + bMitVorbedingung);
|
||||
/*
|
||||
Cloner cloner = new Cloner();
|
||||
cloner.setDumpClonedClasses(true);
|
||||
SectionLogger log = Logger.getSectionLogger("Subst-Methode", Section.UNIFY);
|
||||
Timewatch timer = Timewatch.getTimewatch();
|
||||
de.dhbwstuttgart.logger.Timestamp timestamp = timer.start("Unify-Subst");
|
||||
P = cloner.deepClone(P);
|
||||
a = cloner.deepClone(a);
|
||||
o = cloner.deepClone(o);
|
||||
long time = timestamp.stop();
|
||||
log.debug("Benötigte Zeit für DeepClone: "+time);
|
||||
*/
|
||||
|
||||
|
||||
// richtiger Typ aus Pair raussuchen
|
||||
Type T = null;
|
||||
if( nTypnrInPair == 1 )
|
||||
@ -2500,7 +2339,7 @@ throws MatchException
|
||||
if (o instanceof RefType) {//PL 05-02-09 eingefuegt siehe Methodenkopf
|
||||
if( bMitVorbedingung && isTVinRefType( a, (RefType)o ) )
|
||||
{
|
||||
inferencelog.debug(" Subst nicht m�glich, da TV " + a.getName() + " in RefType " + o.getName());
|
||||
inferencelog.debug(" Subst nicht m<EFBFBD>glich, da TV " + a.getName() + " in RefType " + o.getName());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -2510,7 +2349,7 @@ throws MatchException
|
||||
{
|
||||
// Parameterliste durchgehen
|
||||
Menge vTemp = ((RefType)T).get_ParaList();
|
||||
boolean ret = true; //EINGEFUEGT PL 14-01-16: Return darf erst am Ende zurückgegeben werden und nicht in den ifs
|
||||
Boolean ret = true; //EINGEFUEGT PL 14-01-16: Return darf erst am Ende zur<EFBFBD>ckgegeben werden und nicht in den ifs
|
||||
//sonst werden nicht alle Elemente der Forschleife durchlaufen
|
||||
for( int i = 0; i < vTemp.size(); i++ )
|
||||
{
|
||||
@ -2556,7 +2395,7 @@ throws MatchException
|
||||
return true;
|
||||
}
|
||||
}
|
||||
//Wildcard ergänzt PL 14-12-05
|
||||
//Wildcard erg<EFBFBD>nzt PL 14-12-05
|
||||
if ( T instanceof ExtendsWildcardType )
|
||||
{
|
||||
Type Temp = ((ExtendsWildcardType) T).get_ExtendsType();
|
||||
@ -2571,7 +2410,7 @@ throws MatchException
|
||||
}
|
||||
}
|
||||
}
|
||||
//Wildcard ergänzt PL 14-12-05
|
||||
//Wildcard erg<EFBFBD>nzt PL 14-12-05
|
||||
if ( T instanceof SuperWildcardType )
|
||||
{
|
||||
Type Temp = ((SuperWildcardType) T).get_SuperType();
|
||||
@ -2652,7 +2491,7 @@ throws MatchException
|
||||
{
|
||||
|
||||
|
||||
// otth: Funktion pr�ft, ob Klasse 'Basis' von Klasse 'Mutter' direkt oder indirekt abgeleitet ist
|
||||
// otth: Funktion pr<EFBFBD>ft, ob Klasse 'Basis' von Klasse 'Mutter' direkt oder indirekt abgeleitet ist
|
||||
|
||||
// Basisklasse suchen
|
||||
Menge tto = fc_tto.getTTO();
|
||||
@ -2676,9 +2515,9 @@ throws MatchException
|
||||
}
|
||||
|
||||
/*
|
||||
* Hier wird überprüft ob in der Paraliste ein anderes Element als ein GTV drinne ist.
|
||||
* Sollte ein anderes Element gefunden werden ist Reduce nicht möglich.
|
||||
* Beispiel: Matrix <. Menge<Menge<Integer>> ist nur durch adapt möglich.
|
||||
* Hier wird <EFBFBD>berpr<EFBFBD>ft ob in der Paraliste ein anderes Element als ein GTV drinne ist.
|
||||
* Sollte ein anderes Element gefunden werden ist Reduce nicht m<EFBFBD>glich.
|
||||
* Beispiel: Matrix <. Menge<Menge<Integer>> ist nur durch adapt m<EFBFBD>glich.
|
||||
*/
|
||||
for(Type t : s)
|
||||
{
|
||||
@ -2812,7 +2651,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
if( n >= vD.size() )
|
||||
throw F;
|
||||
|
||||
// Permuationswert f�r 'n' berechnen
|
||||
// Permuationswert f<EFBFBD>r 'n' berechnen
|
||||
Type TV = (Type)vD.elementAt(n);
|
||||
|
||||
int nPos = -1;
|
||||
@ -2844,12 +2683,12 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
// ino.method.printMengeUnifier.28121.body
|
||||
{
|
||||
//PL 05-01-21
|
||||
//Ruft f�r eine Menge von Unifikatoren die Methode
|
||||
//Ruft f<EFBFBD>r eine Menge von Unifikatoren die Methode
|
||||
//printMenge auf
|
||||
for (int i = 0; i < Uni.size(); i++) {
|
||||
inferencelog.debug((i+1) + ". Unifier");
|
||||
printMenge(strMenge, Uni.elementAt(i), nDebug);
|
||||
if( hasSolvedForm( Uni.elementAt(i) ) ) { //PL 13-05-22: hasSolvedForm geaendert, es nicht geklärt, ob es funktioniert.
|
||||
if( hasSolvedForm( Uni.elementAt(i) ) ) { //PL 13-05-22: hasSolvedForm geaendert, es nicht gekl<EFBFBD>rt, ob es funktioniert.
|
||||
inferencelog.debug((i+1) + ". Unifier ist in 'Solved form'!\n");
|
||||
}
|
||||
else {
|
||||
@ -2876,7 +2715,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
}
|
||||
|
||||
for( int tt = 0; tt < E.size(); tt++ ) {
|
||||
//luar 13-03-07 If Else Block gelöscht, da sinnlos.
|
||||
//luar 13-03-07 If Else Block gel<EFBFBD>scht, da sinnlos.
|
||||
if( tt > 0 )
|
||||
strTemp = strTemp + ",\n" + E.elementAt(tt).toString();
|
||||
else
|
||||
@ -2969,7 +2808,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
|
||||
/**
|
||||
* Implementiert die CaptureConversion. Wendet diese auf jeden Typ im Menge TVec an.
|
||||
* Rückgabe ist ein ErgebnisMenge
|
||||
* R<EFBFBD>ckgabe ist ein ErgebnisMenge
|
||||
*/
|
||||
private static Menge<ObjectType> CaptureConversion(Menge<ObjectType> TVec, FC_TTO fc_tto)
|
||||
{
|
||||
@ -2977,7 +2816,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
for(ObjectType t : TVec)
|
||||
{
|
||||
ObjectType ccT = (ObjectType)CaptureConversion(t,fc_tto);
|
||||
//CaptureConversion kann nur ObjectTypes zurückliefern, laesst sich aber nicht zurziehen.
|
||||
//CaptureConversion kann nur ObjectTypes zur<EFBFBD>ckliefern, laesst sich aber nicht zurziehen.
|
||||
if(ccT != null)
|
||||
retVec.add(ccT);
|
||||
}
|
||||
@ -2987,7 +2826,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
/**
|
||||
* Erzeugt die CaptureConversion von einem Typ.
|
||||
*
|
||||
* @param T - Ãbergebener Typ, von welchem die CaptureConversion gemacht werden soll.
|
||||
* @param T - <EFBFBD>bergebener Typ, von welchem die CaptureConversion gemacht werden soll.
|
||||
* @param fc_tto - Hilfsklasse.
|
||||
* @return - CC(T)
|
||||
*/
|
||||
@ -3022,7 +2861,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
if(t instanceof WildcardType)
|
||||
{
|
||||
FreshWildcardType fwcT = ((WildcardType)t).GetFreshWildcardType();
|
||||
//Wenn beim Original Typ an der Stelle eine BoundedGenericTypeVar ist werden die Bounds zu der Wildcard hinzugefügt.
|
||||
//Wenn beim Original Typ an der Stelle eine BoundedGenericTypeVar ist werden die Bounds zu der Wildcard hinzugef<EFBFBD>gt.
|
||||
if(cl.get_ParaList().elementAt(i) instanceof BoundedGenericTypeVar)
|
||||
{
|
||||
BoundedGenericTypeVar bgv = (BoundedGenericTypeVar)cl.get_ParaList().elementAt(i);
|
||||
@ -3036,7 +2875,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
}
|
||||
refT.set_ParaList(ccTypes);
|
||||
}
|
||||
//Wenn eine CaptureConversion durchgeführt wurde den Typ zurückgeben.
|
||||
//Wenn eine CaptureConversion durchgef<EFBFBD>hrt wurde den Typ zur<EFBFBD>ckgeben.
|
||||
if(ccDone)
|
||||
return refT;
|
||||
else
|
||||
@ -3053,13 +2892,13 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
|
||||
//Von hier an Greater implementierung 28-03-07
|
||||
/**
|
||||
* Der Komplette Ablauf von greater und was die einzelnen Teilschritte machen kann anhand von Aktivitätsdiagrammen
|
||||
* im Inovator Projekt, oder in der Studienarbeit Arne Lüdtke, 2007 nachgelesen werden.
|
||||
* Der Komplette Ablauf von greater und was die einzelnen Teilschritte machen kann anhand von Aktivit<EFBFBD>tsdiagrammen
|
||||
* im Inovator Projekt, oder in der Studienarbeit Arne L<EFBFBD>dtke, 2007 nachgelesen werden.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Erzeugt alle Typen die greater sind als T. Gibt diese zurück.
|
||||
* Für den Argumenttype FunN<...> in Typ A<FunN<...> ...> werden keine ? extends-, ? super-Typen erzeugt
|
||||
* Erzeugt alle Typen die greater sind als T. Gibt diese zur<EFBFBD>ck.
|
||||
* F<EFBFBD>r den Argumenttype FunN<...> in Typ A<FunN<...> ...> werden keine ? extends-, ? super-Typen erzeugt
|
||||
*/
|
||||
private static Menge<ObjectType> greater(ObjectType T, FC_TTO fc_tto)
|
||||
//an die Aenderungen im Skript anpassen 07-11-03
|
||||
@ -3084,22 +2923,22 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
//greater1 Erzeugen
|
||||
Menge<ObjectType> greater1Erg = greater1(T,fc_tto);
|
||||
|
||||
//Reflexivität, deshalb T hinzufügen.
|
||||
//Reflexivit<EFBFBD>t, deshalb T hinzuf<EFBFBD>gen.
|
||||
if(!greater1Erg.contains(T))
|
||||
greater1Erg.add(T);
|
||||
|
||||
//Falls in greater1Erg Typen doppelt vorhanden sind werden diese nicht in retVec übernommen.
|
||||
//Falls in greater1Erg Typen doppelt vorhanden sind werden diese nicht in retVec <EFBFBD>bernommen.
|
||||
for(ObjectType t : greater1Erg)
|
||||
if(!retVec.contains(t))
|
||||
retVec.add(t);
|
||||
|
||||
//Ergebnis von greater1 an greater2 durchreichen, ERgebnisse in retVec einfügen
|
||||
//Ergebnis von greater1 an greater2 durchreichen, ERgebnisse in retVec einf<EFBFBD>gen
|
||||
Menge<ObjectType> greater2Erg = greater2(greater1Erg,fc_tto);
|
||||
for(ObjectType t : greater2Erg)
|
||||
if(!retVec.contains(t))
|
||||
retVec.add(t);
|
||||
|
||||
//Ergebnis von greater2 an greater3 durchreichen, ERgebnisse in retVec einfügen
|
||||
//Ergebnis von greater2 an greater3 durchreichen, ERgebnisse in retVec einf<EFBFBD>gen
|
||||
Menge<ObjectType> greater3Erg = greater3(greater2Erg,fc_tto);
|
||||
for(ObjectType t : greater3Erg)
|
||||
if(!retVec.contains(t))
|
||||
@ -3110,7 +2949,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
|
||||
/**
|
||||
* greater1 Schritt von greater.
|
||||
* Für den Argumenttype FunN<...> in Typ A<FunN<...> ...> werden keine ? extends-, ? super-Typen erzeugt
|
||||
* F<EFBFBD>r den Argumenttype FunN<...> in Typ A<FunN<...> ...> werden keine ? extends-, ? super-Typen erzeugt
|
||||
*/
|
||||
private static Menge<ObjectType> greater1(ObjectType T, FC_TTO fc_tto)
|
||||
{
|
||||
@ -3148,8 +2987,8 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
}
|
||||
|
||||
/**
|
||||
* Ãberladung der Funktion cartProductType, damit der Programmierer beim ersten Aufruf nicht den 2. Parameter
|
||||
* welcher für die rekursion erforderlich ist mit übergeben muss.
|
||||
* <EFBFBD>berladung der Funktion cartProductType, damit der Programmierer beim ersten Aufruf nicht den 2. Parameter
|
||||
* welcher f<EFBFBD>r die rekursion erforderlich ist mit <EFBFBD>bergeben muss.
|
||||
*/
|
||||
private static Menge<Menge<Type>> cartProductType (Menge<Menge<Type>> vec)
|
||||
{
|
||||
@ -3158,7 +2997,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
|
||||
/**
|
||||
* Erzeugt das Kartesische Product von mehreren Mengeen von Typen.
|
||||
* Für den Startaufruf ist der index = 0. Danach ruft sich cartProductType rekursiv auf.
|
||||
* F<EFBFBD>r den Startaufruf ist der index = 0. Danach ruft sich cartProductType rekursiv auf.
|
||||
*/
|
||||
private static Menge<Menge<Type>> cartProductType (Menge<Menge<Type>> vec, int index)
|
||||
{
|
||||
@ -3193,8 +3032,8 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
}
|
||||
|
||||
/**
|
||||
* Ãberladung der Funktion cartProductPair, damit der Programmierer beim ersten Aufruf nicht den 2. Parameter
|
||||
* welcher für die rekursion erforderlich ist mit übergeben muss.
|
||||
* <EFBFBD>berladung der Funktion cartProductPair, damit der Programmierer beim ersten Aufruf nicht den 2. Parameter
|
||||
* welcher f<EFBFBD>r die rekursion erforderlich ist mit <EFBFBD>bergeben muss.
|
||||
*/
|
||||
private static Menge<Menge<Pair>> cartProductPair (Menge<Menge<Pair>> vec)
|
||||
{
|
||||
@ -3203,7 +3042,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
|
||||
/**
|
||||
* Erzeugt das Kartesische Product von mehreren Mengeen von Paaren.
|
||||
* Für den Startaufruf ist der index = 0. Danach ruft sich cartProductPair rekursiv auf.
|
||||
* F<EFBFBD>r den Startaufruf ist der index = 0. Danach ruft sich cartProductPair rekursiv auf.
|
||||
*/
|
||||
private static Menge<Menge<Pair>> cartProductPair (Menge<Menge<Pair>> vec, int index)
|
||||
{
|
||||
@ -3263,7 +3102,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
|
||||
/**
|
||||
* greaterArg Schritt von greater
|
||||
* Für den Argumenttype FunN<...> werden keine ? extends-, ? super-Typen erzeugt
|
||||
* F<EFBFBD>r den Argumenttype FunN<...> werden keine ? extends-, ? super-Typen erzeugt
|
||||
*/
|
||||
private static Menge<Type> greaterArg(Type T, FC_TTO fc_tto)
|
||||
{
|
||||
@ -3319,7 +3158,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
return new Menge<Type>();
|
||||
*/
|
||||
|
||||
//Diese Abfrage sorgt für grArg(a) = {a} //Luar 07-07-31
|
||||
//Diese Abfrage sorgt f<EFBFBD>r grArg(a) = {a} //Luar 07-07-31
|
||||
else if(T instanceof TypePlaceholder)
|
||||
retVec.add(T);
|
||||
//Diese Abfrage verhindert, dass bei FunN Wildcard-Typen generiert werden //PL 13-05-22
|
||||
@ -3348,7 +3187,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
Menge<ObjectType> retVec = new Menge<ObjectType>();
|
||||
/*
|
||||
* luar 02-05-07: Beschreibung der Funktion:
|
||||
* Für Jeden Typ aus greater1 durch die FC laufen, und auf der Linken seite einen Match versuchen.
|
||||
* F<EFBFBD>r Jeden Typ aus greater1 durch die FC laufen, und auf der Linken seite einen Match versuchen.
|
||||
* Wenn das Funktioniert, dann ist der Typ auf der rechten Seite auch greater.
|
||||
* */
|
||||
Hashtable<JavaClassName,Type> ht = new Hashtable<JavaClassName,Type>();
|
||||
@ -3373,7 +3212,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
RefType TA2neu = ((RefType)p.TA2).clone();
|
||||
SubstHashtableGeneric(TA2neu,ht);
|
||||
|
||||
//TA2neu ist greater als T. Einfügen in retVec
|
||||
//TA2neu ist greater als T. Einf<EFBFBD>gen in retVec
|
||||
if(!retVec.contains(TA2neu))
|
||||
retVec.add(TA2neu);
|
||||
}
|
||||
@ -3403,12 +3242,12 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
|
||||
//Von hier an Smaller implementierung luar 28-03-07
|
||||
/**
|
||||
* Der Komplette Ablauf von smaller und was die einzelnen Teilschritte machen kann anhand von Aktivitätsdiagrammen
|
||||
* im Inovator Projekt, oder in der Studienarbeit Arne Lüdtke, 2007 nachgelesen werden.
|
||||
* Der Komplette Ablauf von smaller und was die einzelnen Teilschritte machen kann anhand von Aktivit<EFBFBD>tsdiagrammen
|
||||
* im Inovator Projekt, oder in der Studienarbeit Arne L<EFBFBD>dtke, 2007 nachgelesen werden.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Erzeugt alle Typen die smaller sind als T. Gibt diese zurück.
|
||||
* Erzeugt alle Typen die smaller sind als T. Gibt diese zur<EFBFBD>ck.
|
||||
*/
|
||||
private static Menge<ObjectType> smaller(ObjectType T, FC_TTO fc_tto)
|
||||
//an die Aenderungen im Skript anpassen 07-11-03
|
||||
@ -3444,18 +3283,18 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
if(!smaller12Erg.contains(T))
|
||||
smaller12Erg.add(T);
|
||||
|
||||
//Ergebnise in retVec einfügen. Doppelte werden gelöscht.
|
||||
//Ergebnise in retVec einf<EFBFBD>gen. Doppelte werden gel<EFBFBD>scht.
|
||||
for(ObjectType t : smaller12Erg)
|
||||
if(!retVec.contains(t))
|
||||
retVec.add(t);
|
||||
|
||||
//Ergebnis von smaller1 und smaller2 an smaller3 weitergeben, Ergebnisse einfügen.
|
||||
//Ergebnis von smaller1 und smaller2 an smaller3 weitergeben, Ergebnisse einf<EFBFBD>gen.
|
||||
Menge<ObjectType> smaller3Erg = smaller3(smaller12Erg,fc_tto);
|
||||
for(ObjectType t : smaller3Erg)
|
||||
if(!retVec.contains(t))
|
||||
retVec.add(t);
|
||||
|
||||
//Ergebnisse von smaller3 an smaller4 weitergeben, Ergebnisse einfügen.
|
||||
//Ergebnisse von smaller3 an smaller4 weitergeben, Ergebnisse einf<EFBFBD>gen.
|
||||
Menge<ObjectType> smaller4Erg = smaller4(smaller3Erg);
|
||||
for(ObjectType t : smaller4Erg)
|
||||
if(!retVec.contains(t))
|
||||
@ -3504,7 +3343,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
Menge<Type> retVec = new Menge<Type>();
|
||||
if(T instanceof ExtendsWildcardType)
|
||||
{
|
||||
//Für eine ExtendsWildcard rekursiv smaller0 aufrufen, und neue Wildcards erzeugen.
|
||||
//F<EFBFBD>r eine ExtendsWildcard rekursiv smaller0 aufrufen, und neue Wildcards erzeugen.
|
||||
ExtendsWildcardType exT = (ExtendsWildcardType)T;
|
||||
Menge<ObjectType> smallerTypes = smaller0(exT.get_ExtendsType(),fc_tto);
|
||||
for(ObjectType t : smallerTypes)
|
||||
@ -3515,7 +3354,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
}
|
||||
else if(T instanceof SuperWildcardType)
|
||||
{
|
||||
//Für eine SuperWildcard rekursiv greater0 aufrufen, unr neue Wildcards erzeugen.
|
||||
//F<EFBFBD>r eine SuperWildcard rekursiv greater0 aufrufen, unr neue Wildcards erzeugen.
|
||||
SuperWildcardType suT = (SuperWildcardType)T;
|
||||
Menge<ObjectType> greaterTypes = greater0(suT.get_SuperType(),fc_tto);
|
||||
for(ObjectType t : greaterTypes)
|
||||
@ -3554,7 +3393,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
Menge<ObjectType> retVec = new Menge<ObjectType>();
|
||||
/*
|
||||
* luar 02-05-07: Beschreibung der Funktion:
|
||||
* Für Jeden Typ aus Smaller12 durch die FC laufen, und auf der Rechten seite einen Match versuchen.
|
||||
* F<EFBFBD>r Jeden Typ aus Smaller12 durch die FC laufen, und auf der Rechten seite einen Match versuchen.
|
||||
* Wenn das Funktioniert, dann ist der Typ auf der linken Seite auch smaller.
|
||||
* */
|
||||
Hashtable<JavaClassName,Type> ht = new Hashtable<JavaClassName,Type>();
|
||||
@ -3577,7 +3416,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
//Macht hat funktioniert. In Linker Seite Typen substituieren
|
||||
RefType TA1neu = ((RefType)p.TA1).clone();
|
||||
SubstHashtableGeneric(TA1neu,ht);
|
||||
//TA1neu ist smaller als T. Einfügen in retVec
|
||||
//TA1neu ist smaller als T. Einf<EFBFBD>gen in retVec
|
||||
if(!retVec.contains(TA1neu))
|
||||
retVec.add(TA1neu);
|
||||
}
|
||||
@ -3627,12 +3466,12 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
}
|
||||
|
||||
/**
|
||||
* Gibt True zurück, wenn T eine FreshWildcard ist, oder im Falle eines RefTypes oder WildcardTypes eine FreshWildcard enthält.
|
||||
* Gibt True zur<EFBFBD>ck, wenn T eine FreshWildcard ist, oder im Falle eines RefTypes oder WildcardTypes eine FreshWildcard enth<EFBFBD>lt.
|
||||
*/
|
||||
private static boolean DelFreshWildcardTypeVar(Type T)
|
||||
{
|
||||
//luar 29-05-2007
|
||||
//Ãberprüft rekursiv ob in dem RefType ein FreshWildcardType enthalten ist.
|
||||
//<EFBFBD>berpr<EFBFBD>ft rekursiv ob in dem RefType ein FreshWildcardType enthalten ist.
|
||||
if(T instanceof RefType)
|
||||
{
|
||||
RefType refT = (RefType)T;
|
||||
@ -3641,7 +3480,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
if(DelFreshWildcardTypeVar(t))
|
||||
return true;
|
||||
}
|
||||
//Im Falle einer Wildcard, Typen aus der WC rausnehmen und diesen rekursiv prüfen.
|
||||
//Im Falle einer Wildcard, Typen aus der WC rausnehmen und diesen rekursiv pr<EFBFBD>fen.
|
||||
if(T instanceof ExtendsWildcardType)
|
||||
return DelFreshWildcardTypeVar(((ExtendsWildcardType)T).get_ExtendsType());
|
||||
|
||||
@ -3651,12 +3490,5 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.:
|
||||
return T instanceof FreshWildcardType;
|
||||
}
|
||||
|
||||
public static <A extends DeepCloneable> Menge<A> deepClone(Menge<A> m){
|
||||
Timewatch watch = Timewatch.getTimewatch();
|
||||
Timestamp timer = watch.start("Unify - deepClone");
|
||||
Menge<A> ret = m.stream().<A>map((Function<A,A>)(x -> x.deepClone())).<Menge<A>>collect(Menge::new, Menge::add, Menge::addAll);
|
||||
timer.stop();
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
// ino.end
|
||||
|
Loading…
Reference in New Issue
Block a user