From fa92fee98de4651c038d91e432b550e035ea437b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Sat, 30 Sep 2017 14:51:05 +0200 Subject: [PATCH 1/3] modified: .classpath Keine Ahnung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit modified: src/de/dhbwstuttgart/typeinference/unify/RuleSet.java Aenderung Zeile 578 rhsType = pair.getRhsType(); //PL eingefuegt 2017-09-29 statt !((rhsType = pair.getRhsType()) instanceof PlaceholderType) if(lhsType != null //&& !((rhsType = pair.getRhsType()) instanceof PlaceholderType) //PL geloescht am 2017-09-29 Begründung: auch Typvariablen muessen ersetzt werden. modified: src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java 1. Aenderung: Zeile 168 /* * Step 6 a) Restart (fork) for pairs where subst was applied */ if(parallel) { if //(eqPrime.equals(eq)) //PL 2017-09-29 auskommentiert und durch (!eqPrimePrime.isPresent()) //PL 2071-09-29 dies ersetzt //Begruendung: Wenn in der Substitution keine Veraenderung //(!eqPrimePrime.isPresent()) erfolgt ist, ist das Ergebnis erzielt. eqPrimePrimeSet.add(eqPrime); 2. Aenderung: Ziel 188 else { // sequentiell (Step 6b is included) if //(eqPrime.equals(eq)) //PL 2017-09-29 auskommentiert und durch (!eqPrimePrime.isPresent()) //PL 2071-09-29 dies ersetzt //Begruendung: Wenn in der Substitution keine Veraenderung //(!eqPrimePrime.isPresent()) erfolgt ist, ist das Ergebnis erzielt. eqPrimePrimeSet.add(eqPrime); --- .classpath | 1 - .../dhbwstuttgart/typeinference/unify/RuleSet.java | 3 ++- .../typeinference/unify/TypeUnifyTask.java | 12 +++++++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.classpath b/.classpath index 5877484d..8d756e94 100644 --- a/.classpath +++ b/.classpath @@ -16,7 +16,6 @@ - diff --git a/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java b/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java index 2b641125..06134d6b 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java +++ b/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java @@ -575,8 +575,9 @@ public class RuleSet implements IRuleSet{ if(pair.getPairOp() == PairOperator.EQUALSDOT && pair.getLhsType() instanceof PlaceholderType) lhsType = (PlaceholderType) pair.getLhsType(); + rhsType = pair.getRhsType(); //PL eingefuegt 2017-09-29 statt !((rhsType = pair.getRhsType()) instanceof PlaceholderType) if(lhsType != null - && !((rhsType = pair.getRhsType()) instanceof PlaceholderType) + //&& !((rhsType = pair.getRhsType()) instanceof PlaceholderType) //PL geloescht am 2017-09-29 Begründung: auch Typvariablen muessen ersetzt werden. && typeMap.get(lhsType) > 1 // The type occurs in more pairs in the set than just the recent pair. && !rhsType.getTypeParams().occurs(lhsType)) { Unifier uni = new Unifier(lhsType, rhsType); diff --git a/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index be67ea09..09bb15b8 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -119,7 +119,7 @@ public class TypeUnifyTask extends RecursiveTask>> { // Sets of the "second level" Set undefinedPairs = new HashSet<>(); Set>>> secondLevelSets = calculatePairSets(eq2s, fc, undefinedPairs); - + //PL 2017-09-20: Im calculatePairSets wird möglicherweise O .< java.lang.Integer nicht ausgewertet Faculty Beispiel im 1. Schritt // If pairs occured that did not match one of the cartesian product cases, // those pairs are contradictory and the unification is impossible. if(!undefinedPairs.isEmpty()) @@ -169,7 +169,10 @@ public class TypeUnifyTask extends RecursiveTask>> { * Step 6 a) Restart (fork) for pairs where subst was applied */ if(parallel) { - if (eqPrime.equals(eq)) + if //(eqPrime.equals(eq)) //PL 2017-09-29 auskommentiert und durch + (!eqPrimePrime.isPresent()) //PL 2071-09-29 dies ersetzt + //Begruendung: Wenn in der Substitution keine Veraenderung + //(!eqPrimePrime.isPresent()) erfolgt ist, ist das Ergebnis erzielt. eqPrimePrimeSet.add(eqPrime); else if(eqPrimePrime.isPresent()) { TypeUnifyTask fork = new TypeUnifyTask(eqPrimePrime.get(), fc, true); @@ -183,7 +186,10 @@ public class TypeUnifyTask extends RecursiveTask>> { } } else { // sequentiell (Step 6b is included) - if (eqPrime.equals(eq)) + if //(eqPrime.equals(eq)) //PL 2017-09-29 auskommentiert und durch + (!eqPrimePrime.isPresent()) //PL 2071-09-29 dies ersetzt + //Begruendung: Wenn in der Substitution keine Veraenderung + //(!eqPrimePrime.isPresent()) erfolgt ist, ist das Ergebnis erzielt. eqPrimePrimeSet.add(eqPrime); else if(eqPrimePrime.isPresent()) eqPrimePrimeSet.addAll(unify(eqPrimePrime.get(), fc, false)); From 7f888a1bf8286bb1d29c864017b9888abc862385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Tue, 3 Oct 2017 21:58:39 +0200 Subject: [PATCH 2/3] modified: src/de/dhbwstuttgart/typeinference/unify/RuleSet.java FunType von Bedingung <. auf beliebig zu gelassen modified: src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java bei childrenaufruf unifyCase1 gleiches Element hinzugefuegt modified: test/typeinference/JavaTXCompilerTest.java typeinference-Aufruf vor die Schleife gezogen --- .../typeinference/unify/RuleSet.java | 5 +++-- .../typeinference/unify/TypeUnifyTask.java | 15 +++++++++++---- test/typeinference/JavaTXCompilerTest.java | 4 ++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java b/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java index 06134d6b..c8222a62 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java +++ b/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java @@ -689,8 +689,9 @@ public class RuleSet implements IRuleSet{ @Override public Optional> reduceFunN(UnifyPair pair) { - if(pair.getPairOp() != PairOperator.SMALLERDOT) - return Optional.empty(); + //if(pair.getPairOp() != PairOperator.SMALLERDOT) //PL 2017-10-03 auskommentiert, + //da Regel auch fuer EQUALSDOT anwendbar + // return Optional.empty(); UnifyType lhsType = pair.getLhsType(); UnifyType rhsType = pair.getRhsType(); diff --git a/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index 09bb15b8..af672837 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -73,7 +73,8 @@ public class TypeUnifyTask extends RecursiveTask>> { * @param fc The finite closure * @return The set of all principal type unifiers */ - protected Set> unify(Set eq, IFiniteClosure fc, boolean parallel) { + protected Set> unify(Set eq, IFiniteClosure fc, boolean parallel) { + System.out.println(eq); /* * Step 1: Repeated application of reduce, adapt, erase, swap */ @@ -119,7 +120,10 @@ public class TypeUnifyTask extends RecursiveTask>> { // Sets of the "second level" Set undefinedPairs = new HashSet<>(); Set>>> secondLevelSets = calculatePairSets(eq2s, fc, undefinedPairs); - //PL 2017-09-20: Im calculatePairSets wird möglicherweise O .< java.lang.Integer nicht ausgewertet Faculty Beispiel im 1. Schritt + //PL 2017-09-20: Im calculatePairSets wird möglicherweise O .< java.lang.Integer + //nicht ausgewertet Faculty Beispiel im 1. Schritt + //PL 2017-10-03 geloest, muesste noch mit FCs mit kleineren + //Typen getestet werden. // If pairs occured that did not match one of the cartesian product cases, // those pairs are contradictory and the unification is impossible. if(!undefinedPairs.isEmpty()) @@ -158,12 +162,14 @@ public class TypeUnifyTask extends RecursiveTask>> { // Flatten the cartesian product Set eqPrime = new HashSet<>(); setToFlatten.stream().forEach(x -> eqPrime.addAll(x)); + System.out.println(eqPrime); /* * Step 5: Substitution */ Optional> eqPrimePrime = rules.subst(eqPrime); - + System.out.println(eq); + System.out.println(eqPrimePrime); /* * Step 6 a) Restart (fork) for pairs where subst was applied @@ -446,7 +452,8 @@ public class TypeUnifyTask extends RecursiveTask>> { for(UnifyType c : cs) { Set thetaQs = fc.getChildren(c).stream().collect(Collectors.toCollection(HashSet::new)); - //thetaQs.add(thetaPrime); + thetaQs.add(thetaPrime); //PL 2017-10-03: War auskommentiert habe ich wieder einkommentiert, + //da children offensichtlich ein echtes kleiner und kein kleinergleich ist Set thetaQPrimes = new HashSet<>(); TypeParams cParams = c.getTypeParams(); if(cParams.size() == 0) diff --git a/test/typeinference/JavaTXCompilerTest.java b/test/typeinference/JavaTXCompilerTest.java index 7ea13498..512b895e 100644 --- a/test/typeinference/JavaTXCompilerTest.java +++ b/test/typeinference/JavaTXCompilerTest.java @@ -44,12 +44,12 @@ public class JavaTXCompilerTest { //filesToTest.add(new File(rootDirectory+"Matrix.jav")); //filesToTest.add(new File(rootDirectory+"Import.jav")); JavaTXCompiler compiler = new JavaTXCompiler(fileToTest); - compiler.typeInference(); + List results = compiler.typeInference(); for(File f : compiler.sourceFiles.keySet()){ SourceFile sf = compiler.sourceFiles.get(f); System.out.println(ASTTypePrinter.print(sf)); - List results = compiler.typeInference(); + //List results = compiler.typeInference(); PL 2017-10-03 vor die For-Schleife gezogen assert results.size()>0; for(ResultSet resultSet : results){ Set result = TypeInsertFactory.createTypeInsertPoints(sf, resultSet); From 0a8236cd86031b41a54c82db18a65a2663fe8920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Tue, 3 Oct 2017 22:06:37 +0200 Subject: [PATCH 3/3] modified: src/de/dhbwstuttgart/typeinference/unify/RuleSet.java In reduceFunN: && (pair.getPairOp() != PairOperator.EQUALSDOT)) //PL 2017-10-03 hinzugefuegt //da Regel auch fuer EQUALSDOT anwendbar //TODO: fuer allen anderen Relationen noch pruefen --- src/de/dhbwstuttgart/typeinference/unify/RuleSet.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java b/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java index c8222a62..39ea0eff 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java +++ b/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java @@ -689,9 +689,11 @@ public class RuleSet implements IRuleSet{ @Override public Optional> reduceFunN(UnifyPair pair) { - //if(pair.getPairOp() != PairOperator.SMALLERDOT) //PL 2017-10-03 auskommentiert, - //da Regel auch fuer EQUALSDOT anwendbar - // return Optional.empty(); + if((pair.getPairOp() != PairOperator.SMALLERDOT) + && (pair.getPairOp() != PairOperator.EQUALSDOT)) //PL 2017-10-03 hinzugefuegt + //da Regel auch fuer EQUALSDOT anwendbar + //TODO: fuer allen anderen Relationen noch pruefen + return Optional.empty(); UnifyType lhsType = pair.getLhsType(); UnifyType rhsType = pair.getRhsType();