diff --git a/src/de/dhbwstuttgart/typeinference/unify/Unify.java b/src/de/dhbwstuttgart/typeinference/unify/Unify.java index c5afe522b..7f95f98ac 100755 --- a/src/de/dhbwstuttgart/typeinference/unify/Unify.java +++ b/src/de/dhbwstuttgart/typeinference/unify/Unify.java @@ -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�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 in Typ A ...> werden keine ? extends-, ? super-Typen erzeugt + * F�r den Argumenttype FunN<...> in Typ A ...> werden keine ? extends-, ? super-Typen erzeugt */ + //public static Menge> unifyWC (Menge E, FC_TTO fc_tto) public static Menge> unify (Menge E, FC_TTO fc_tto) { - return unifyFiltered(E, fc_tto,true); - } - - //public static Menge> unifyWC (Menge E, FC_TTO fc_tto) - public static Menge> unifyFiltered (Menge 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 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�nnen nicht mehr Unifiziert werden. fail. inferencelog.debug("UNIFY FAIL:" + p.TA1 + " <. " + p.TA2 + " muesste mindestens einen TPH enthalten."); return new Menge>(); } @@ -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�r das Kartesiche Produkt. + * Hier werden die Paare verglichen. Je nach Struktur k�nnen neue Paare erzeugt * werden, aus denen dann das kartesische Produkt gebildet wird.*/ Menge>> cartProduktSets = new Menge>>(); 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�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 �berpr�ft, und evtl. durch die FC entstandene TPHs werden gel�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�ndert lassen, wenn eine GenericTypeVar ist Menge> setofsetofpairs = new Menge>(); Menge vTmp = new Menge(); 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 �berpr�ft, und evtl. durch die FC entstandene TPHs werden gel�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 �berpr�ft, und evtl. durch die FC entstandene TPHs werden gel�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> vecvecpair : cartProduktSets){ - OderConstraint orConstraints = new OderConstraint(); - for(Menge pairs : vecvecpair){ - UndConstraint uCons = new UndConstraint(); - for(Pair p : pairs){ - uCons.addConstraint(p.TA1, p.TA2); - } - orConstraints.addConstraint(uCons); - } - cSet.add(orConstraints); - } - - Menge> bigCartProductErg3 = cSet.cartesianProduct(); - if(filter)log.debug("Karthesisches Produkt nach Filterung: "+bigCartProductErg3); - Sets.cartesianProduct(bigCartProductErg3); - */ - - if(filter){ - //Cloner cloner = new Cloner(); - Menge>> temp = new Menge<>(); //hier werden gefilterte Constraints gesammelt - Menge undMenge = new Menge(); //Die Menge von Pairs, welche in jedem Kartesischen Produkt enthalten sind. - //undMenge.addAll(cloner.deepClone(Eq1)); - undMenge.addAll(Unify.deepClone(Eq1)); - Menge>> oderConstraints = new Menge<>();//Die zu filternden Constraints - for (Menge> 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> oderConstraint : oderConstraints){ - Menge> filteredOCons = new Menge<>(); //diese Menge sammelt nur Cons - for(Menge pairs : oderConstraint){ - Menge testMenge = new Menge(); - //testMenge.addAll(cloner.deepClone(undMenge)); - //testMenge.addAll(cloner.deepClone(pairs)); - testMenge.addAll(Unify.deepClone(undMenge)); - testMenge.addAll(Unify.deepClone(pairs)); - Menge> test = Unify.unifyFiltered(testMenge, fc_tto, false); - if(test.size()>0){ - filteredOCons.add(pairs); - } - else{ - log.debug("Ausgesondertes Constraint: "+pairs); - } - } - temp.add(filteredOCons); - } - SetView>> difference = Sets.difference(cartProduktSets, temp); - log.debug("Ausgelöschte Constraints: "+difference.toString()); - cartProduktSets = temp; - /* - Unifier filterUnify = (pairs)->{ - String pairsString = pairs.toString(); - Menge> 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�gliche Kombinationen ausfiltern + //Hier wird aus den in Schritt 4, Teil 1 erzeugten Vektoren das Kartesische Produkt gebilden. Menge helpvp; Menge> bigCartProductErg = new Menge>(); bigCartProductErg.addElement(copyMengePair(Eq1)); @@ -747,33 +639,13 @@ public class Unify } } } - - /* - if(! bigCartProductErg.equals(bigCartProductErg3)){ - for(int i = 0; i> changedSets = new Menge>(); Menge> notChangedSets = new Menge>(); - int counter = 0; for(Menge 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�ckgegeben wird. Menge> Eq2Set = new Menge>(); - //Schritt 6A: Beginnen mit Schritt 1 bei den geänderten. + //Schritt 6A: Beginnen mit Schritt 1 bei den ge�nderten. for(Menge vecpair : changedSets) { Menge> 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�ft worden. Sie k�nnen direkt eingef�gt werden. Eq2Set.addAll(unifyErgs); } - //Schritt 6B Einfügen der nicht geänderten. + //Schritt 6B Einf�gen der nicht ge�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�ssen nur die Ergebnisse aus 6B gepr�ft werden. */ for(Menge vecpair : notChangedSets) { - //Überprüfen ob Menge in SolvedForm ist. + //�berpr�fen ob Menge in SolvedForm ist. if(hasSolvedForm(vecpair)) //PL 13-05-22 hasSolvedForm angepasst { - //Überprüfung auf FreshTypeVars in den Typen + //�berpr�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�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�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 * 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�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�ft werden sollen. + * @param test - RefType gegen den gepr�ft werden soll. */ private static void testUnifyErg(Menge> unifyErgs, RefType test) { @@ -938,7 +810,7 @@ public class Unify vec--; } } - //Gleiche Mengeen löschen + //Gleiche Mengeen l�schen for(int i = 0; i < unifyErgs.size(); i++) { Menge p1 = unifyErgs.elementAt(i); @@ -967,13 +839,13 @@ public class Unify } /** - * Diese Methode generiert einen Menge> wobei immer der übergebene TA1 vorne steht, und jeder Typ aus otherPairTypes hinten. + * Diese Methode generiert einen Menge> wobei immer der �bergebene TA1 vorne steht, und jeder Typ aus otherPairTypes hinten. * Beispiel: otherPairTypes = [Integer, Number, Menge], TA1 = TPH a. * return: [[TPH a = Integer],[TPH a = Number],[TPH a = Menge]] * * @param TA1 - Der Typ der immer vorne steht * @param otherPairTypes - Die anderen Typen - * @return - Ein Menge> der alle Paare enthält. + * @return - Ein Menge> der alle Paare enth�lt. */ private static Menge> generateSetOfSetOfPair(Type TA1, Menge otherPairTypes) { @@ -1074,7 +946,7 @@ public class Unify //Menge wird geclont, Elemente nicht //Menge Mub = (Menge)ub.clone(); - //Elemente die nicht kleinste obere Schranken sind, werden gel�scht + //Elemente die nicht kleinste obere Schranken sind, werden gel�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�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�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�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�glich: Permutation fehlgeschlagen!"); break; } } else { - inferencelog.info("---- Unifikation nicht m�glich: Anzahl der Parameter verschieden!"); + inferencelog.info("---- Unifikation nicht m�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�glich: Permutation fehlgeschlagen!"); break; } } else { - inferencelog.info("---- Unifikation nicht m�glich: Anzahl der Parameter verschieden!"); + inferencelog.info("---- Unifikation nicht m�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�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�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�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�glich: Permutation fehlgeschlagen!"); break; } } @@ -1643,7 +1515,7 @@ throws MatchException } - // Subst --> noch zu pr�fen + // Subst --> noch zu pr�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�tigerweise pi verwendet wird (siehe Kommentar in reduce2), kann reduceEq einfach an reduce2 deligieren. */ private static void reduceEq(Menge 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� 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 �berfl�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 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�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 allGreater (BoundedGenericTypeVar ty, Menge FC) - // ino.end - // ino.method.allGreater.29428.body - { - CRefTypeSet ret = new CRefTypeSet(); - Iterator 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 allGreater (RefType ty, Menge 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 w�re hier gleich wie Menge + // z.B. Menge w�re hier gleich wie Menge // z.B. FC = { ( AA <=* CC< DD > ) ,...} // R1 = AA @@ -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 w�re hier gleich wie Menge + // z.B. Menge w�re hier gleich wie Menge // z.B. FC = { ( AA <=* CC< DD > ) ,...} // R1 = AA @@ -2391,7 +2242,7 @@ throws MatchException Menge 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�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�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�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�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�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�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> ist nur durch adapt möglich. + * 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> ist nur durch adapt m�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�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�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�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�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�ckgabe ist ein ErgebnisMenge */ private static Menge CaptureConversion(Menge 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�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 - �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�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�hrt wurde den Typ zur�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�tsdiagrammen + * im Inovator Projekt, oder in der Studienarbeit Arne L�dtke, 2007 nachgelesen werden. */ /** - * Erzeugt alle Typen die greater sind als T. Gibt diese zurück. - * Für den Argumenttype FunN<...> in Typ A ...> werden keine ? extends-, ? super-Typen erzeugt + * Erzeugt alle Typen die greater sind als T. Gibt diese zur�ck. + * F�r den Argumenttype FunN<...> in Typ A ...> werden keine ? extends-, ? super-Typen erzeugt */ private static Menge 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 greater1Erg = greater1(T,fc_tto); - //Reflexivität, deshalb T hinzufügen. + //Reflexivit�t, deshalb T hinzuf�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 �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�gen Menge 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�gen Menge 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 ...> werden keine ? extends-, ? super-Typen erzeugt + * F�r den Argumenttype FunN<...> in Typ A ...> werden keine ? extends-, ? super-Typen erzeugt */ private static Menge 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. + * �berladung der Funktion cartProductType, damit der Programmierer beim ersten Aufruf nicht den 2. Parameter + * welcher f�r die rekursion erforderlich ist mit �bergeben muss. */ private static Menge> cartProductType (Menge> 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�r den Startaufruf ist der index = 0. Danach ruft sich cartProductType rekursiv auf. */ private static Menge> cartProductType (Menge> 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. + * �berladung der Funktion cartProductPair, damit der Programmierer beim ersten Aufruf nicht den 2. Parameter + * welcher f�r die rekursion erforderlich ist mit �bergeben muss. */ private static Menge> cartProductPair (Menge> 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�r den Startaufruf ist der index = 0. Danach ruft sich cartProductPair rekursiv auf. */ private static Menge> cartProductPair (Menge> 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�r den Argumenttype FunN<...> werden keine ? extends-, ? super-Typen erzeugt */ private static Menge greaterArg(Type T, FC_TTO fc_tto) { @@ -3319,7 +3158,7 @@ tempKlasse.get_Superclass_Name() ); System.out.println( "P. S.: return new Menge(); */ - //Diese Abfrage sorgt für grArg(a) = {a} //Luar 07-07-31 + //Diese Abfrage sorgt f�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 retVec = new Menge(); /* * 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�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 ht = new Hashtable(); @@ -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�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�tsdiagrammen + * im Inovator Projekt, oder in der Studienarbeit Arne L�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�ck. */ private static Menge 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�gen. Doppelte werden gel�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�gen. Menge 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�gen. Menge 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 retVec = new Menge(); if(T instanceof ExtendsWildcardType) { - //Für eine ExtendsWildcard rekursiv smaller0 aufrufen, und neue Wildcards erzeugen. + //F�r eine ExtendsWildcard rekursiv smaller0 aufrufen, und neue Wildcards erzeugen. ExtendsWildcardType exT = (ExtendsWildcardType)T; Menge 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�r eine SuperWildcard rekursiv greater0 aufrufen, unr neue Wildcards erzeugen. SuperWildcardType suT = (SuperWildcardType)T; Menge 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 retVec = new Menge(); /* * 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�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 ht = new Hashtable(); @@ -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�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�ck, wenn T eine FreshWildcard ist, oder im Falle eines RefTypes oder WildcardTypes eine FreshWildcard enth�lt. */ private static boolean DelFreshWildcardTypeVar(Type T) { //luar 29-05-2007 - //Überprüft rekursiv ob in dem RefType ein FreshWildcardType enthalten ist. + //�berpr�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�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 Menge deepClone(Menge m){ - Timewatch watch = Timewatch.getTimewatch(); - Timestamp timer = watch.start("Unify - deepClone"); - Menge ret = m.stream().map((Function)(x -> x.deepClone())).>collect(Menge::new, Menge::add, Menge::addAll); - timer.stop(); - return ret; - } } // ino.end