From f87943409c8ae2e9f6ed81e7a1cfc5109c16f31a Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 10 Jul 2010 01:23:07 +0200 Subject: Split Term code to individual class sources --- src/Var.vala | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/Var.vala (limited to 'src/Var.vala') diff --git a/src/Var.vala b/src/Var.vala new file mode 100644 index 0000000..1437ede --- /dev/null +++ b/src/Var.vala @@ -0,0 +1,58 @@ +namespace Eva { + public class Var : Object, Term { + public string name {get; construct;} + + public Var(string name0) { + assert(name0.get_char() == '_' || name0.get_char().isupper()); + + Object(name: name0); + } + + public string to_string() { + return name; + } + + internal static string alias(string key, Gee.Map aliases) { + if(!(key in aliases)) + return key; + else + return alias(aliases[key], aliases); + } + + protected bool do_match(Term o, Gee.Map vars, Gee.Map aliases) { + string key = alias(name, aliases); + + if(o is Var) { + Var v = o as Var; + string vkey = alias(v.name, aliases); + + if(key == vkey) + return true; + + if(key in vars && vkey in vars) + return vars[key].do_match(vars[vkey], vars, aliases); + else if(!(vkey in vars)) { + aliases[vkey] = key; + return true; + } + else /* !(key in vars) */ { + aliases[key] = vkey; + return true; + } + } + else { + if(key in vars) { + return vars[key].do_match(o, vars, aliases); + } + else { + vars[key] = o; + return true; + } + } + } + + public void encode(Erl.Buffer buffer) { + assert_not_reached(); + } + } +} -- cgit v1.2.3