From d14af6a1f9f4d59dc08829d9d382c0c44fa1eaa4 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Thu, 24 May 2018 22:23:51 +0200 Subject: Getting it to work with hastabel2idp... --- src/hastabel/LangLexer.g4 | 2 +- src/hastabel/LangParser.g4 | 2 +- src/hastabel/Predicates.java | 9 ++---- src/hastabel/PropertyLexer.g4 | 2 +- src/hastabel/PropertyParser.g4 | 64 ++++++++++++++++++++-------------------- src/hastabel/World.java | 10 +++---- src/hastabel/lang/Predicate.java | 48 +++++++++++++++++++++++++----- 7 files changed, 83 insertions(+), 54 deletions(-) diff --git a/src/hastabel/LangLexer.g4 b/src/hastabel/LangLexer.g4 index 45062f0..773ae54 100644 --- a/src/hastabel/LangLexer.g4 +++ b/src/hastabel/LangLexer.g4 @@ -13,7 +13,7 @@ SUB_TYPE_OF: '::'; STAR: '*'; ADD_TYPE_KW: 'add_type' SEP; -ADD_RELATION_KW: 'add_relation' SEP; +ADD_PREDICATE_KW: ('add_predicate' | 'add_function') SEP; ADD_TEMPLATE_KW: 'add_template' SEP; WS: SEP; diff --git a/src/hastabel/LangParser.g4 b/src/hastabel/LangParser.g4 index 6d881a9..e71bf81 100644 --- a/src/hastabel/LangParser.g4 +++ b/src/hastabel/LangParser.g4 @@ -37,7 +37,7 @@ lang_instr: { } - | (WS)* ADD_RELATION_KW (WS)* new_predicate (WS)* + | (WS)* ADD_PREDICATE_KW (WS)* new_predicate (WS)* { } diff --git a/src/hastabel/Predicates.java b/src/hastabel/Predicates.java index 07c47a3..66eebd7 100644 --- a/src/hastabel/Predicates.java +++ b/src/hastabel/Predicates.java @@ -38,17 +38,12 @@ public class Predicates return result; } - if (signature.equals(previous_instance.get_signature())) + if (previous_instance.get_signatures().contains(signature)) { return previous_instance; } - System.err.println - ( - "[F] Conflicting signatures for predicate \"" - + name - + "\"." - ); + previous_instance.add_signature(signature); return null; } diff --git a/src/hastabel/PropertyLexer.g4 b/src/hastabel/PropertyLexer.g4 index b047ebb..568e0ff 100644 --- a/src/hastabel/PropertyLexer.g4 +++ b/src/hastabel/PropertyLexer.g4 @@ -9,7 +9,7 @@ R_PAREN: ')'; L_BRAKT: '['; R_BRAKT: ']'; -TAG_EXISTING_KW: '(tag_existing' SEP; +TAG_EXISTING_KW: '(seek' SEP; IFF_OPERATOR_KW: '(iff' SEP; AND_OPERATOR_KW: '(and' SEP; diff --git a/src/hastabel/PropertyParser.g4 b/src/hastabel/PropertyParser.g4 index 9e51f01..b0685ad 100644 --- a/src/hastabel/PropertyParser.g4 +++ b/src/hastabel/PropertyParser.g4 @@ -699,7 +699,7 @@ ag_operator [Variable current_node] { final Type path_type; final Variable next_path; - final hastabel.lang.Predicate is_in_path, is_path_of; + final hastabel.lang.Predicate contains_node, is_path_of; if (current_node == null) { @@ -717,10 +717,10 @@ ag_operator [Variable current_node] } path_type = WORLD.get_types_manager().get("path"); - is_in_path = WORLD.get_predicates_manager().get("is_in_path"); + contains_node = WORLD.get_predicates_manager().get("contains_node"); is_path_of = WORLD.get_predicates_manager().get("is_path_of"); - if ((path_type == null) || (is_path_of == null) || (is_in_path == null)) + if ((path_type == null) || (is_path_of == null) || (contains_node == null)) { WORLD.invalidate(); } @@ -745,7 +745,7 @@ ag_operator [Variable current_node] next_node, Formula.implies ( - is_in_path.as_formula_(next_node, next_path), + contains_node.as_formula_(next_path, next_node), ($formula.result) ) ) @@ -786,7 +786,7 @@ eg_operator [Variable current_node] { final Type path_type; final Variable next_path; - final hastabel.lang.Predicate is_in_path, is_path_of; + final hastabel.lang.Predicate contains_node, is_path_of; if (current_node == null) { @@ -804,10 +804,10 @@ eg_operator [Variable current_node] } path_type = WORLD.get_types_manager().get("path"); - is_in_path = WORLD.get_predicates_manager().get("is_in_path"); + contains_node = WORLD.get_predicates_manager().get("contains_node"); is_path_of = WORLD.get_predicates_manager().get("is_path_of"); - if ((path_type == null) || (is_path_of == null) || (is_in_path == null)) + if ((path_type == null) || (is_path_of == null) || (contains_node == null)) { WORLD.invalidate(); } @@ -832,7 +832,7 @@ eg_operator [Variable current_node] next_node, Formula.implies ( - is_in_path.as_formula_(next_node, next_path), + contains_node.as_formula_(next_path, next_node), ($formula.result) ) ) @@ -873,7 +873,7 @@ af_operator [Variable current_node] { final Type path_type; final Variable next_path; - final hastabel.lang.Predicate is_in_path, is_path_of; + final hastabel.lang.Predicate contains_node, is_path_of; if (current_node == null) { @@ -891,10 +891,10 @@ af_operator [Variable current_node] } path_type = WORLD.get_types_manager().get("path"); - is_in_path = WORLD.get_predicates_manager().get("is_in_path"); + contains_node = WORLD.get_predicates_manager().get("contains_node"); is_path_of = WORLD.get_predicates_manager().get("is_path_of"); - if ((path_type == null) || (is_path_of == null) || (is_in_path == null)) + if ((path_type == null) || (is_path_of == null) || (contains_node == null)) { WORLD.invalidate(); } @@ -919,7 +919,7 @@ af_operator [Variable current_node] next_node, Formula.and ( - is_in_path.as_formula_(next_node, next_path), + contains_node.as_formula_(next_path, next_node), ($formula.result) ) ) @@ -960,7 +960,7 @@ ef_operator [Variable current_node] { final Type path_type; final Variable next_path; - final hastabel.lang.Predicate is_in_path, is_path_of; + final hastabel.lang.Predicate contains_node, is_path_of; if (current_node == null) { @@ -978,10 +978,10 @@ ef_operator [Variable current_node] } path_type = WORLD.get_types_manager().get("path"); - is_in_path = WORLD.get_predicates_manager().get("is_in_path"); + contains_node = WORLD.get_predicates_manager().get("contains_node"); is_path_of = WORLD.get_predicates_manager().get("is_path_of"); - if ((path_type == null) || (is_path_of == null) || (is_in_path == null)) + if ((path_type == null) || (is_path_of == null) || (contains_node == null)) { WORLD.invalidate(); } @@ -1006,7 +1006,7 @@ ef_operator [Variable current_node] next_node, Formula.and ( - is_in_path.as_formula_(next_node, next_path), + contains_node.as_formula_(next_path, next_node), ($formula.result) ) ) @@ -1051,7 +1051,7 @@ au_operator [Variable current_node] { final Type path_type; final Variable next_path; - final hastabel.lang.Predicate is_path_of, is_in_path, is_before; + final hastabel.lang.Predicate is_path_of, contains_node, is_before; if (current_node == null) { @@ -1070,14 +1070,14 @@ au_operator [Variable current_node] path_type = WORLD.get_types_manager().get("path"); is_path_of = WORLD.get_predicates_manager().get("is_path_of"); - is_in_path = WORLD.get_predicates_manager().get("is_in_path"); + contains_node = WORLD.get_predicates_manager().get("contains_node"); is_before = WORLD.get_predicates_manager().get("is_before"); if ( (path_type == null) || (is_path_of == null) - || (is_in_path == null) + || (contains_node == null) || (is_before == null) ) { @@ -1104,7 +1104,7 @@ au_operator [Variable current_node] f2_node, Formula.and ( - is_in_path.as_formula_(f2_node, next_path), + contains_node.as_formula_(next_path, f2_node), ($f2.result), Formula.forall ( @@ -1158,7 +1158,7 @@ eu_operator [Variable current_node] { final Type path_type; final Variable next_path; - final hastabel.lang.Predicate is_path_of, is_in_path, is_before; + final hastabel.lang.Predicate is_path_of, contains_node, is_before; if (current_node == null) { @@ -1177,14 +1177,14 @@ eu_operator [Variable current_node] path_type = WORLD.get_types_manager().get("path"); is_path_of = WORLD.get_predicates_manager().get("is_path_of"); - is_in_path = WORLD.get_predicates_manager().get("is_in_path"); + contains_node = WORLD.get_predicates_manager().get("contains_node"); is_before = WORLD.get_predicates_manager().get("is_before"); if ( (path_type == null) || (is_path_of == null) - || (is_in_path == null) + || (contains_node == null) || (is_before == null) ) { @@ -1211,7 +1211,7 @@ eu_operator [Variable current_node] f2_node, Formula.and ( - is_in_path.as_formula_(f2_node, next_path), + contains_node.as_formula_(next_path, f2_node), ($f2.result), Formula.forall ( @@ -1262,7 +1262,7 @@ depth_no_parent_operator [Variable current_node] { final Type path_type; final Variable next_path, node_of_path; - final hastabel.lang.Predicate depth, is_path_of, is_lower_than, is_in_path, is_before; + final hastabel.lang.Predicate depth, is_path_of, is_lower_than, contains_node, is_before; if (current_node == null) { @@ -1282,7 +1282,7 @@ depth_no_parent_operator [Variable current_node] path_type = WORLD.get_types_manager().get("path"); depth = WORLD.get_predicates_manager().get("depth"); is_path_of = WORLD.get_predicates_manager().get("is_path_of"); - is_in_path = WORLD.get_predicates_manager().get("is_in_path"); + contains_node = WORLD.get_predicates_manager().get("contains_node"); is_before = WORLD.get_predicates_manager().get("is_before"); is_lower_than = WORLD.get_predicates_manager().get("is_lower_than"); @@ -1290,7 +1290,7 @@ depth_no_parent_operator [Variable current_node] ( (path_type == null) || (is_path_of == null) - || (is_in_path == null) + || (contains_node == null) || (is_lower_than == null) || (is_before == null) || (depth == null) @@ -1322,7 +1322,7 @@ depth_no_parent_operator [Variable current_node] node_for_f, Formula.and ( - is_in_path.as_formula_(node_for_f, next_path), + contains_node.as_formula_(next_path, node_for_f), ($formula.result), Formula.not ( @@ -1392,7 +1392,7 @@ depth_no_change_operator [Variable current_node] { final Type path_type; final Variable next_path, node_of_path; - final hastabel.lang.Predicate depth, is_path_of, is_in_path, is_before; + final hastabel.lang.Predicate depth, is_path_of, contains_node, is_before; if (current_node == null) { @@ -1412,14 +1412,14 @@ depth_no_change_operator [Variable current_node] path_type = WORLD.get_types_manager().get("path"); depth = WORLD.get_predicates_manager().get("depth"); is_path_of = WORLD.get_predicates_manager().get("is_path_of"); - is_in_path = WORLD.get_predicates_manager().get("is_in_path"); + contains_node = WORLD.get_predicates_manager().get("contains_node"); is_before = WORLD.get_predicates_manager().get("is_before"); if ( (path_type == null) || (is_path_of == null) - || (is_in_path == null) + || (contains_node == null) || (is_before == null) || (depth == null) ) @@ -1450,7 +1450,7 @@ depth_no_change_operator [Variable current_node] node_for_f, Formula.and ( - is_in_path.as_formula_(node_for_f, next_path), + contains_node.as_formula_(next_path, node_for_f), ($formula.result), Formula.equals ( diff --git a/src/hastabel/World.java b/src/hastabel/World.java index d7dc2a0..aaa66e4 100644 --- a/src/hastabel/World.java +++ b/src/hastabel/World.java @@ -52,14 +52,14 @@ public class World extends LogicWorld parser.lang_file(this); - if (!is_erroneous) - { - is_erroneous = !(new GraphToFirstOrder("path_")).run(this); - } - return !is_erroneous; } + public void ensure_first_order () + { + is_erroneous = !(new GraphToFirstOrder("path_")).run(this); + } + public Formula load_property (final String filename) throws IOException { diff --git a/src/hastabel/lang/Predicate.java b/src/hastabel/lang/Predicate.java index 1b9571f..bfdd701 100644 --- a/src/hastabel/lang/Predicate.java +++ b/src/hastabel/lang/Predicate.java @@ -11,13 +11,25 @@ import java.util.ArrayList; public class Predicate { - private final List signature; + private final Collection> signatures; private final Set> members; private final String name; public Predicate (final List signature, final String name) { - this.signature = signature; + signatures = new ArrayList>(1); + signatures.add(signature); + + this.name = name; + + members = new HashSet>(); + } + + public Predicate (final Collection> signatures, final String name) + { + this.signatures = new ArrayList>(); + this.signatures.addAll(signatures); + this.name = name; members = new HashSet>(); @@ -48,7 +60,11 @@ public class Predicate } } - public boolean is_compatible_with (final List elements) + private boolean is_compatible_with_signature + ( + final List elements, + final List signature + ) { final Iterator e_iter; final Iterator s_iter; @@ -72,14 +88,27 @@ public class Predicate return true; } + public boolean is_compatible_with (final List elements) + { + for (final List signature: signatures) + { + if (is_compatible_with_signature(elements, signature)) + { + return true; + } + } + + return false; + } + public String get_name () { return name; } - public List get_signature () + public Collection> get_signatures () { - return signature; + return signatures; } public Set> get_members () @@ -89,7 +118,7 @@ public class Predicate public Predicate shallow_copy () { - return new Predicate(signature, name); + return new Predicate(signatures, name); } @Override @@ -113,6 +142,11 @@ public class Predicate return name.hashCode(); } + public void add_signature (final List signature) + { + signatures.add(signature); + } + public String get_definition () { final StringBuilder sb; @@ -146,7 +180,7 @@ public class Predicate final Iterator s_iter; sb = new StringBuilder(); - s_iter = signature.iterator(); + s_iter = ((List) signatures.toArray()[0]).iterator(); sb.append(name); sb.append(": "); -- cgit v1.2.3-70-g09d2