cartesian products

This commit is contained in:
Florian Steurer 2015-11-27 19:52:59 +01:00
parent 97e0e2fc72
commit 53dd7b019e
2 changed files with 22 additions and 8 deletions

View File

@ -54,13 +54,18 @@ public class Unify {
List<List<Set<MPair>>> pairSetsSet = calculatePairSets(eq2s, fc); List<List<Set<MPair>>> pairSetsSet = calculatePairSets(eq2s, fc);
// The sets of the "first level" // The sets of the "first level"
Set<Set<MPair>> sets = new HashSet<Set<MPair>>(); Set<Set<?>> sets = new HashSet<Set<?>>();
sets.add(eq1s); // Add Eq1'
if(eq1s.size() != 0)
sets.add(eq1s); // Add Eq1'
// Add the set of [a =. Theta | (a=. Theta) in Eq2'] // Add the set of [a =. Theta | (a=. Theta) in Eq2']
sets.add(eq2s.stream() Set<MPair> bufferSet = eq2s.stream()
.filter(x -> x.getPairOp() == PairOperator.EQUALSDOT && x.getLhsType() instanceof PlaceholderType) .filter(x -> x.getPairOp() == PairOperator.EQUALSDOT && x.getLhsType() instanceof PlaceholderType)
.collect(Collectors.toSet())); .collect(Collectors.toSet());
if(bufferSet.size() != 0)
sets.add(bufferSet);
/* Up to here, no cartesian products are calculated. /* Up to here, no cartesian products are calculated.
* Around here, filters for pairs and sets can be applied */ * Around here, filters for pairs and sets can be applied */
@ -69,13 +74,19 @@ public class Unify {
// Calculate the inner cartesian products // Calculate the inner cartesian products
// Cartesian products of the second level // Cartesian products of the second level
// AddAll -> nur add
for(List<Set<MPair>> pairSets : pairSetsSet) // Prüfen ob addAll stimmt oder ob hier eigentlich nur 1 set sein sollte for(List<Set<MPair>> pairSets : pairSetsSet) // Prüfen ob addAll stimmt oder ob hier eigentlich nur 1 set sein sollte
setOps.cartesianProduct(pairSets).forEach(x -> sets.add(new HashSet<MPair>(x))); sets.add(setOps.cartesianProduct(pairSets).stream().map(x -> new HashSet<>(x)).collect(Collectors.toSet()));
System.out.println(sets);
// Calculate the outer cartesian products // Calculate the outer cartesian products
// Cartesian products of the first level // Cartesian products of the first level
Set<List<MPair>> eqsSet = setOps.cartesianProduct(new ArrayList<>(sets)); Set<List<Object>> eqsSet = setOps.cartesianProduct(new ArrayList<>(sets));
System.out.println(eqsSet);
/* /*
* Step 5: Substitution * Step 5: Substitution
*/ */
@ -90,7 +101,8 @@ public class Unify {
* Step 7: Filter result for solved pairs * Step 7: Filter result for solved pairs
*/ */
throw new NotImplementedException(); return null;
} }
protected Set<MPair> applyTypeUnificationRules(Set<MPair> eq, IFiniteClosure fc) { protected Set<MPair> applyTypeUnificationRules(Set<MPair> eq, IFiniteClosure fc) {

View File

@ -25,12 +25,14 @@ public class UnifyTest extends Unify {
IFiniteClosure fc = fcb.getCollectionExample(); IFiniteClosure fc = fcb.getCollectionExample();
// Vector<Integer> <. Vector<A> // Vector<Integer> <. Vector<A>
// Vector<Integer <. Vector<C>
// A <. Number // A <. Number
// Double <. B // Double <. B
// B <. Object // B <. Object
eq.add(new MPair(tf.getSimpleType("Vector", tf.getSimpleType("Integer")), tf.getSimpleType("Vector", "A"), PairOperator.SMALLERDOT)); eq.add(new MPair(tf.getSimpleType("Vector", tf.getSimpleType("Integer")), tf.getSimpleType("Vector", "A"), PairOperator.SMALLERDOT));
eq.add(new MPair(tf.getSimpleType("Vector", tf.getSimpleType("Integer")), tf.getSimpleType("Vector", "C"), PairOperator.SMALLERDOT));
eq.add(new MPair(tf.getPlaceholderType("A"), tf.getSimpleType("Number"), PairOperator.SMALLERDOT)); eq.add(new MPair(tf.getPlaceholderType("A"), tf.getSimpleType("Number"), PairOperator.SMALLERDOT));
eq.add(new MPair(tf.getPlaceholderType("A"), tf.getPlaceholderType("C"), PairOperator.SMALLERDOT)); //eq.add(new MPair(tf.getPlaceholderType("A"), tf.getPlaceholderType("C"), PairOperator.SMALLERDOT));
eq.add(new MPair(tf.getSimpleType("Double"), tf.getPlaceholderType("B"), PairOperator.SMALLERDOT)); eq.add(new MPair(tf.getSimpleType("Double"), tf.getPlaceholderType("B"), PairOperator.SMALLERDOT));
eq.add(new MPair(tf.getPlaceholderType("B"), tf.getSimpleType("Object"), PairOperator.EQUALSDOT)); eq.add(new MPair(tf.getPlaceholderType("B"), tf.getSimpleType("Object"), PairOperator.EQUALSDOT));