summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/hastabel/PropertyParser.g479
-rw-r--r--src/hastabel/lang/Predicate.java89
-rw-r--r--src/hastabel/lang/Type.java13
3 files changed, 179 insertions, 2 deletions
diff --git a/src/hastabel/PropertyParser.g4 b/src/hastabel/PropertyParser.g4
index b0685ad..581c445 100644
--- a/src/hastabel/PropertyParser.g4
+++ b/src/hastabel/PropertyParser.g4
@@ -180,6 +180,8 @@ predicate [Variable current_node]
ids.add(0, current_node);
}
+ predicate.mark_as_used();
+
$result = predicate.as_formula(ids);
}
;
@@ -222,6 +224,8 @@ function [Variable current_node]
ids.add(0, current_node);
}
+ predicate.mark_as_used_as_function();
+
$result = predicate.as_function(ids);
}
;
@@ -269,6 +273,8 @@ regex_special_predicate [Variable current_node]
WORLD.invalidate();
}
+ string_matches.mark_as_used();
+
$result = string_matches.as_formula(Arrays.asList(params));
}
;
@@ -399,6 +405,7 @@ variable_declaration
WORLD.invalidate();
}
+ t.mark_as_used();
$variable = WORLD.get_variables_manager().add_variable(t, ($var.text));
if (($variable) == null)
@@ -492,6 +499,8 @@ ctl_verifies_operator [Variable current_node]
WORLD.invalidate();
}
+ node_type.mark_as_used();
+
root_node =
WORLD.get_variables_manager().new_anonymous_variable(node_type);
@@ -549,6 +558,8 @@ ax_operator [Variable current_node]
WORLD.invalidate();
}
+ node_type.mark_as_used();
+
next_node =
WORLD.get_variables_manager().new_anonymous_variable(node_type);
@@ -588,6 +599,8 @@ ax_operator [Variable current_node]
WORLD.invalidate();
}
+ node_connect.mark_as_used();
+
$result =
Formula.forall
(
@@ -616,6 +629,8 @@ ex_operator [Variable current_node]
WORLD.invalidate();
}
+ node_type.mark_as_used();
+
next_node =
WORLD.get_variables_manager().new_anonymous_variable(node_type);
@@ -655,6 +670,8 @@ ex_operator [Variable current_node]
WORLD.invalidate();
}
+ node_connect.mark_as_used();
+
$result =
Formula.exists
(
@@ -683,6 +700,8 @@ ag_operator [Variable current_node]
WORLD.invalidate();
}
+ node_type.mark_as_used();
+
next_node =
WORLD.get_variables_manager().new_anonymous_variable(node_type);
@@ -725,6 +744,10 @@ ag_operator [Variable current_node]
WORLD.invalidate();
}
+ path_type.mark_as_used();
+ contains_node.mark_as_used();
+ is_path_of.mark_as_used();
+
next_path =
WORLD.get_variables_manager().new_anonymous_variable(path_type);
@@ -769,6 +792,8 @@ eg_operator [Variable current_node]
WORLD.invalidate();
}
+ node_type.mark_as_used();
+
next_node =
WORLD.get_variables_manager().new_anonymous_variable(node_type);
@@ -812,6 +837,10 @@ eg_operator [Variable current_node]
WORLD.invalidate();
}
+ path_type.mark_as_used();
+ contains_node.mark_as_used();
+ is_path_of.mark_as_used();
+
next_path =
WORLD.get_variables_manager().new_anonymous_variable(path_type);
@@ -856,6 +885,8 @@ af_operator [Variable current_node]
WORLD.invalidate();
}
+ node_type.mark_as_used();
+
next_node =
WORLD.get_variables_manager().new_anonymous_variable(node_type);
@@ -899,6 +930,11 @@ af_operator [Variable current_node]
WORLD.invalidate();
}
+ path_type.mark_as_used();
+ contains_node.mark_as_used();
+ is_path_of.mark_as_used();
+
+
next_path =
WORLD.get_variables_manager().new_anonymous_variable(path_type);
@@ -943,6 +979,8 @@ ef_operator [Variable current_node]
WORLD.invalidate();
}
+ node_type.mark_as_used();
+
next_node =
WORLD.get_variables_manager().new_anonymous_variable(node_type);
@@ -986,6 +1024,10 @@ ef_operator [Variable current_node]
WORLD.invalidate();
}
+ path_type.mark_as_used();
+ contains_node.mark_as_used();
+ is_path_of.mark_as_used();
+
next_path =
WORLD.get_variables_manager().new_anonymous_variable(path_type);
@@ -1030,6 +1072,8 @@ au_operator [Variable current_node]
WORLD.invalidate();
}
+ node_type.mark_as_used();
+
f1_node =
WORLD.get_variables_manager().new_anonymous_variable(node_type);
@@ -1084,6 +1128,11 @@ au_operator [Variable current_node]
WORLD.invalidate();
}
+ path_type.mark_as_used();
+ contains_node.mark_as_used();
+ is_path_of.mark_as_used();
+ is_before.mark_as_used();
+
next_path =
WORLD.get_variables_manager().new_anonymous_variable(path_type);
@@ -1137,6 +1186,8 @@ eu_operator [Variable current_node]
WORLD.invalidate();
}
+ node_type.mark_as_used();
+
f1_node =
WORLD.get_variables_manager().new_anonymous_variable(node_type);
@@ -1191,6 +1242,11 @@ eu_operator [Variable current_node]
WORLD.invalidate();
}
+ path_type.mark_as_used();
+ contains_node.mark_as_used();
+ is_path_of.mark_as_used();
+ is_before.mark_as_used();
+
next_path =
WORLD.get_variables_manager().new_anonymous_variable(path_type);
@@ -1245,6 +1301,8 @@ depth_no_parent_operator [Variable current_node]
WORLD.invalidate();
}
+ node_type.mark_as_used();
+
node_for_f =
WORLD.get_variables_manager().new_anonymous_variable(node_type);
@@ -1260,7 +1318,7 @@ depth_no_parent_operator [Variable current_node]
(WS)* R_PAREN
{
- final Type path_type;
+ final Type path_type, depth_type;
final Variable next_path, node_of_path;
final hastabel.lang.Predicate depth, is_path_of, is_lower_than, contains_node, is_before;
@@ -1280,6 +1338,7 @@ depth_no_parent_operator [Variable current_node]
}
path_type = WORLD.get_types_manager().get("path");
+ depth_type = WORLD.get_types_manager().get("depth");
depth = WORLD.get_predicates_manager().get("depth");
is_path_of = WORLD.get_predicates_manager().get("is_path_of");
contains_node = WORLD.get_predicates_manager().get("contains_node");
@@ -1299,6 +1358,14 @@ depth_no_parent_operator [Variable current_node]
WORLD.invalidate();
}
+ path_type.mark_as_used();
+ depth_type.mark_as_used();
+ depth.mark_as_used();
+ contains_node.mark_as_used();
+ is_path_of.mark_as_used();
+ is_before.mark_as_used();
+ is_lower_than.mark_as_used();
+
next_path =
WORLD.get_variables_manager().new_anonymous_variable(path_type);
@@ -1390,7 +1457,7 @@ depth_no_change_operator [Variable current_node]
(WS)* R_PAREN
{
- final Type path_type;
+ final Type path_type, depth_type;
final Variable next_path, node_of_path;
final hastabel.lang.Predicate depth, is_path_of, contains_node, is_before;
@@ -1410,6 +1477,7 @@ depth_no_change_operator [Variable current_node]
}
path_type = WORLD.get_types_manager().get("path");
+ depth_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");
contains_node = WORLD.get_predicates_manager().get("contains_node");
@@ -1427,6 +1495,13 @@ depth_no_change_operator [Variable current_node]
WORLD.invalidate();
}
+ path_type.mark_as_used();
+ depth_type.mark_as_used();
+ depth.mark_as_used();
+ contains_node.mark_as_used();
+ is_path_of.mark_as_used();
+ is_before.mark_as_used();
+
next_path =
WORLD.get_variables_manager().new_anonymous_variable(path_type);
diff --git a/src/hastabel/lang/Predicate.java b/src/hastabel/lang/Predicate.java
index bfdd701..47b9ed8 100644
--- a/src/hastabel/lang/Predicate.java
+++ b/src/hastabel/lang/Predicate.java
@@ -14,6 +14,7 @@ public class Predicate
private final Collection<List<Type>> signatures;
private final Set<List<Element>> members;
private final String name;
+ private boolean is_used;
public Predicate (final List<Type> signature, final String name)
{
@@ -23,6 +24,8 @@ public class Predicate
this.name = name;
members = new HashSet<List<Element>>();
+
+ is_used = false;
}
public Predicate (final Collection<List<Type>> signatures, final String name)
@@ -116,6 +119,72 @@ public class Predicate
return members;
}
+ public Set<List<Type>> get_relevant_signatures ()
+ {
+ final Set<List<Type>> result;
+
+ result = new HashSet<List<Type>>();
+
+ for (final List<Type> signature: signatures)
+ {
+ boolean relevant_signature;
+
+ relevant_signature = true;
+
+ for (final Type sig_type: signature)
+ {
+ if (!sig_type.is_used())
+ {
+ relevant_signature = false;
+
+ break;
+ }
+ }
+
+ if (relevant_signature)
+ {
+ result.add(signature);
+ }
+ }
+
+ return result;
+ }
+
+ public Set<List<Element>> get_relevant_members
+ (
+ final Set<List<Type>> relevant_signatures
+ )
+ {
+ final Set<List<Element>> result;
+
+ Set<List<Element>> current_members, next_members;
+
+ next_members = members;
+
+ result = new HashSet<List<Element>>();
+
+ for (final List<Type> signature: relevant_signatures)
+ {
+ current_members = next_members;
+
+ next_members = new HashSet<List<Element>>();
+
+ for (final List<Element> member: current_members)
+ {
+ if (is_compatible_with_signature(member, signature))
+ {
+ result.add(member);
+ }
+ else
+ {
+ next_members.add(member);
+ }
+ }
+ }
+
+ return result;
+ }
+
public Predicate shallow_copy ()
{
return new Predicate(signatures, name);
@@ -173,6 +242,26 @@ public class Predicate
return sb.toString();
}
+ public void mark_as_used ()
+ {
+ is_used = true;
+ }
+
+ public void mark_as_used_as_function ()
+ {
+ for (final List<Type> signature: signatures)
+ {
+ signature.get(signature.size() - 1).mark_as_used();
+ }
+
+ is_used = true;
+ }
+
+ public boolean is_used ()
+ {
+ return is_used;
+ }
+
@Override
public String toString ()
{
diff --git a/src/hastabel/lang/Type.java b/src/hastabel/lang/Type.java
index 9676605..89a2cd2 100644
--- a/src/hastabel/lang/Type.java
+++ b/src/hastabel/lang/Type.java
@@ -12,6 +12,7 @@ public class Type
private final Set<Type> sub_types;
private final Type super_type;
private final String name;
+ private boolean is_used;
public Type (final Type super_type, final String name)
{
@@ -19,6 +20,8 @@ public class Type
this.elements = new HashSet<Element>();
this.sub_types = new HashSet<Type>();
this.super_type = super_type;
+
+ is_used = false;
}
public void add_sub_type (final Type t)
@@ -36,6 +39,16 @@ public class Type
return name;
}
+ public void mark_as_used ()
+ {
+ is_used = true;
+ }
+
+ public boolean is_used ()
+ {
+ return is_used;
+ }
+
public void add_element (final Element e)
{
elements.add(e);