From 587ca62b5c8ee60605aff876cb1101f515348491 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Fri, 25 May 2018 14:13:59 +0200 Subject: Still working on jokers and multiple signatures... --- src/hastabel/lang/Predicate.java | 165 ++++++++++++++++++++++++++------ src/hastabel/lang/PredicateFormula.java | 3 + 2 files changed, 141 insertions(+), 27 deletions(-) (limited to 'src') 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 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 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 signature - ) - { - for (final Type type: signature) - { - type.mark_as_used(); - } - } - private boolean is_compatible_with_partial_signature ( final List signature, @@ -159,6 +145,35 @@ public class Predicate } private boolean is_compatible_with_signature + ( + final List elements, + final List signature + ) + { + final Iterator e_iter; + final Iterator 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 cannot be converted to List" + private boolean is_compatible_with_signature2 ( final List elements, final List signature @@ -186,17 +201,75 @@ public class Predicate return true; } - public boolean is_compatible_with (final List elements) + private List mask_through_partial_signature + ( + final List elements, + final List signature + ) + { + final List result; + final Iterator e_iter; + final Iterator s_iter; + + if (elements.size() != signature.size()) + { + return null; + } + + result = new ArrayList(); + 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 is_compatible_with (final List elements) { for (final List signature: signatures) { if (is_compatible_with_signature(elements, signature)) { - return true; + return signature; } } - return false; + return null; + } + + // "incompatible types: List cannot be converted to List" + public List is_compatible_with2 (final List elements) + { + for (final List 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> get_partial_signatures () + { + return partial_signatures; + } + public Set> get_members () { return members; @@ -266,7 +344,7 @@ public class Predicate for (final List 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> get_relevant_partial_members + ( + final Set> relevant_signatures + ) + { + final Set> result; + + result = new HashSet>(); + + for (final List signature: relevant_signatures) + { + for (final List member: members) + { + final List 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 params) { - final Formula result; + final List 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 params; + private final List signature; public PredicateFormula ( final Predicate parent, + final List signature, final List params ) { this.parent = parent; + this.signature = signature; this.params = params; } } -- cgit v1.2.3-70-g09d2