summaryrefslogtreecommitdiff |
diff options
-rw-r--r-- | src/hastabel/lang/Predicate.java | 165 | ||||
-rw-r--r-- | src/hastabel/lang/PredicateFormula.java | 3 |
2 files changed, 141 insertions, 27 deletions
diff --git a/src/hastabel/lang/Predicate.java b/src/hastabel/lang/Predicate.java index 28674d7..f68c8d8 100644 --- a/src/hastabel/lang/Predicate.java +++ b/src/hastabel/lang/Predicate.java @@ -55,7 +55,7 @@ public class Predicate public void add_member (final List<Element> elements) { - if (is_compatible_with(elements)) + if (is_compatible_with2(elements) != null) { members.add(elements); } @@ -77,13 +77,10 @@ public class Predicate params.add(e); } - if (is_compatible_with(params)) - { - members.add(params); - } + add_member(params); } - private boolean add_and_activate_partial_signature + private boolean add_partial_signature ( final List<Type> partial_signature ) @@ -96,9 +93,9 @@ public class Predicate { if (is_compatible_with_partial_signature(signature, partial_signature)) { - activate_signature(signature); - can_be_added = true; + + break; } } @@ -110,17 +107,6 @@ public class Predicate return can_be_added; } - private void activate_signature - ( - final List<Type> signature - ) - { - for (final Type type: signature) - { - type.mark_as_used(); - } - } - private boolean is_compatible_with_partial_signature ( final List<Type> signature, @@ -160,6 +146,35 @@ public class Predicate private boolean is_compatible_with_signature ( + final List<Expression> elements, + final List<Type> signature + ) + { + final Iterator<Expression> e_iter; + final Iterator<Type> s_iter; + + if (elements.size() != signature.size()) + { + return false; + } + + e_iter = elements.iterator(); + s_iter = signature.iterator(); + + while (e_iter.hasNext()) + { + if (!s_iter.next().includes(e_iter.next().get_type())) + { + return false; + } + } + + return true; + } + + // "incompatible types: List<Element> cannot be converted to List<Expression>" + private boolean is_compatible_with_signature2 + ( final List<Element> elements, final List<Type> signature ) @@ -186,17 +201,75 @@ public class Predicate return true; } - public boolean is_compatible_with (final List<Element> elements) + private List<Element> mask_through_partial_signature + ( + final List<Element> elements, + final List<Type> signature + ) + { + final List<Element> result; + final Iterator<Element> e_iter; + final Iterator<Type> s_iter; + + if (elements.size() != signature.size()) + { + return null; + } + + result = new ArrayList<Element>(); + e_iter = elements.iterator(); + s_iter = signature.iterator(); + + while (e_iter.hasNext()) + { + final Type s_next; + final Element e_next; + + e_next = e_iter.next(); + s_next = s_iter.next(); + + if (s_next == null) + { + continue; + } + else if (!s_next.includes(e_next.get_type())) + { + return null; + } + else + { + result.add(e_next); + } + } + + return result; + } + + public List<Type> is_compatible_with (final List<Expression> elements) { for (final List<Type> signature: signatures) { if (is_compatible_with_signature(elements, signature)) { - return true; + return signature; } } - return false; + return null; + } + + // "incompatible types: List<Element> cannot be converted to List<Expression>" + public List<Type> is_compatible_with2 (final List<Element> elements) + { + for (final List<Type> signature: signatures) + { + if (is_compatible_with_signature2(elements, signature)) + { + return signature; + } + } + + return null; } public String get_name () @@ -209,6 +282,11 @@ public class Predicate return signatures; } + public Collection<List<Type>> get_partial_signatures () + { + return partial_signatures; + } + public Set<List<Element>> get_members () { return members; @@ -266,7 +344,7 @@ public class Predicate for (final List<Element> member: current_members) { - if (is_compatible_with_signature(member, signature)) + if (is_compatible_with_signature2(member, signature)) { result.add(member); } @@ -280,6 +358,34 @@ public class Predicate return result; } + public Set<List<Element>> get_relevant_partial_members + ( + final Set<List<Type>> relevant_signatures + ) + { + final Set<List<Element>> result; + + result = new HashSet<List<Element>>(); + + for (final List<Type> signature: relevant_signatures) + { + for (final List<Element> member: members) + { + final List<Element> potential_member; + + potential_member = + mask_through_partial_signature(member, signature); + + if (potential_member != null) + { + result.add(member); + } + } + } + + return result; + } + public Predicate shallow_copy () { return new Predicate(signatures, partial_signatures, function_type, name); @@ -362,7 +468,7 @@ public class Predicate if (is_partial) { - if (!add_and_activate_partial_signature(partial_signature)) + if (!add_partial_signature(partial_signature)) { System.err.println ( @@ -428,11 +534,16 @@ public class Predicate public Formula as_formula (final List<Expression> params) { - final Formula result; + final List<Type> signature; - result = new PredicateFormula(this, params); + signature = is_compatible_with(params); - return result; + if (signature == null) + { + return null; + } + + return new PredicateFormula(this, signature, params); } public Formula as_formula_ (final Expression... e_params) diff --git a/src/hastabel/lang/PredicateFormula.java b/src/hastabel/lang/PredicateFormula.java index cd86aaf..566c1bd 100644 --- a/src/hastabel/lang/PredicateFormula.java +++ b/src/hastabel/lang/PredicateFormula.java @@ -6,14 +6,17 @@ class PredicateFormula extends Formula { private final Predicate parent; private final List<Expression> params; + private final List<Type> signature; public PredicateFormula ( final Predicate parent, + final List<Type> signature, final List<Expression> params ) { this.parent = parent; + this.signature = signature; this.params = params; } } |