Exemple #1
0
        public NaiveResolvent(Clause clause1, Term term1, Clause clause2, Term term2)
        {
            Clause1 = (Clause)clause1.Clone();
            Term1 = (Term)term1.Clone();
            Clause2 = (Clause)clause2.Clone();
            Term2 = (Term)term2.Clone();

            var atoms = new List<Term>();
            atoms.AddRange(clause1.Terms);
            atoms.AddRange(clause2.Terms);

            foreach (var term in atoms.Snapshot())
            {
                if (term.Equals(term1) || term.Counters(term1))
                {
                    atoms.Remove(term);
                }
            }

            Terms = atoms;
            EliminateDuplicateAtoms();

            // This is bullshit, since resolvents should be able to participate
            // in solving process later on.
//            Terms = new List<Term>(Terms).AsReadOnly();
        }
Exemple #2
0
        public override void Visit(TermNode node)
        {
            Term term;
            IAstTreeNode clauseRoot;

            if (node.Parent is NegationNode)
            {
                term = new Term(node, false);
                clauseRoot = node.Parent.Parent;
            }
            else if (node.Parent is OrNode || node.Parent is L1Expression)
            {
                term = new Term(node, true);
                clauseRoot = node.Parent;
            }
            else if (node.Parent is AndNode)
            {
                term = new Term(node, true);
                clauseRoot = node;
            }
            else
            {
                throw new NotSupportedException(String.Format(
                    "Not a CNF or fatal error: '{0}", node.Parent));
            }

            if (!_clauses.ContainsKey(clauseRoot)) _clauses[clauseRoot] = new Clause();
            _clauses[clauseRoot].Terms.Add(term);
        }
Exemple #3
0
 public bool Counters(Term term)
 {
     return
         // Keklol, I should've implemented civilized term comparison :)
         term.TermNode.ToString() == this.TermNode.ToString() &&
         term.Polarity ^ this.Polarity;
 }
Exemple #4
0
 public bool Equals(Term obj)
 {
     if(ReferenceEquals(null, obj))
     {
         return false;
     }
     if(ReferenceEquals(this, obj))
     {
         return true;
     }
     return obj.Polarity.Equals(Polarity) && Equals(obj.TermNode.ToString(), TermNode.ToString());
 }
Exemple #5
0
        public static XformTerm NaiveUnifier(Term term1, Term term2)
        {
            if (term1.Token != term2.Token || 
                term1.TermNode.Children.Count != term2.TermNode.Children.Count)
            {
                return null;
            }
            else
            {
                for (var i = 0; i < term1.TermNode.Children.Count; ++i)
                {
                    var arg1C = term1.TermNode.Children[i] as ConstantNode;
                    var arg1V = term1.TermNode.Children[i] as VariableNode;

                    var arg2C = term2.TermNode.Children[i] as ConstantNode;
                    var arg2V = term2.TermNode.Children[i] as VariableNode;

                    if (arg1C != null && arg2C != null)
                    {
                        if (arg1C.Token != arg2C.Token)
                        {
                            return null;
                        }
                    }
                    else if (arg1V != null && arg2V != null)
                    {
                        if (arg1V.Token != arg2V.Token)
                        {
                            XformTerm xform = term => SubstituteWithVariable(term, arg1V.Token, arg2V.Token);
                            return xform.Composition(NaiveUnifier(xform(term1), xform(term2)));
                        }
                    }
                    else
                    {
                        var argC = arg1C ?? arg2C;
                        var argV = arg1V ?? arg2V;

                        XformTerm xform = term => SubstituteWithConstant(term, argV.Token, argC.Token);
                        return xform.Composition(NaiveUnifier(xform(term1), xform(term2)));
                    }
                }

                return term => term;
            }
        }