Package org.ggp.base.util.prover.aima.renamer

Source Code of org.ggp.base.util.prover.aima.renamer.VariableRenamer

package org.ggp.base.util.prover.aima.renamer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.ggp.base.util.gdl.grammar.GdlConstant;
import org.ggp.base.util.gdl.grammar.GdlDistinct;
import org.ggp.base.util.gdl.grammar.GdlFunction;
import org.ggp.base.util.gdl.grammar.GdlLiteral;
import org.ggp.base.util.gdl.grammar.GdlNot;
import org.ggp.base.util.gdl.grammar.GdlOr;
import org.ggp.base.util.gdl.grammar.GdlPool;
import org.ggp.base.util.gdl.grammar.GdlProposition;
import org.ggp.base.util.gdl.grammar.GdlRelation;
import org.ggp.base.util.gdl.grammar.GdlRule;
import org.ggp.base.util.gdl.grammar.GdlSentence;
import org.ggp.base.util.gdl.grammar.GdlTerm;
import org.ggp.base.util.gdl.grammar.GdlVariable;


public class VariableRenamer
{

  private int nextName;

  public VariableRenamer()
  {
    nextName = 0;
  }

  public GdlRule rename(GdlRule rule)
  {
    return renameRule(rule, new HashMap<GdlVariable, GdlVariable>());
  }

  public GdlSentence rename(GdlSentence sentence)
  {
    return renameSentence(sentence, new HashMap<GdlVariable, GdlVariable>());
  }

  private GdlConstant renameConstant(GdlConstant constant, Map<GdlVariable, GdlVariable> renamings)
  {
    return constant;
  }

  private GdlDistinct renameDistinct(GdlDistinct distinct, Map<GdlVariable, GdlVariable> renamings)
  {
    if (distinct.isGround())
    {
      return distinct;
    }
    else
    {
      GdlTerm arg1 = renameTerm(distinct.getArg1(), renamings);
      GdlTerm arg2 = renameTerm(distinct.getArg2(), renamings);

      return GdlPool.getDistinct(arg1, arg2);
    }
  }

  private GdlFunction renameFunction(GdlFunction function, Map<GdlVariable, GdlVariable> renamings)
  {
    if (function.isGround())
    {
      return function;
    }
    else
    {
      GdlConstant name = renameConstant(function.getName(), renamings);

      List<GdlTerm> body = new ArrayList<GdlTerm>();
      for (int i = 0; i < function.arity(); i++)
      {
        body.add(renameTerm(function.get(i), renamings));
      }

      return GdlPool.getFunction(name, body);
    }
  }

  private GdlLiteral renameLiteral(GdlLiteral literal, Map<GdlVariable, GdlVariable> renamings)
  {
    if (literal instanceof GdlDistinct)
    {
      return renameDistinct((GdlDistinct) literal, renamings);
    }
    else if (literal instanceof GdlNot)
    {
      return renameNot((GdlNot) literal, renamings);
    }
    else if (literal instanceof GdlOr)
    {
      return renameOr((GdlOr) literal, renamings);
    }
    else
    {
      return renameSentence((GdlSentence) literal, renamings);
    }
  }

  private GdlNot renameNot(GdlNot not, Map<GdlVariable, GdlVariable> renamings)
  {
    if (not.isGround())
    {
      return not;
    }
    else
    {
      GdlLiteral body = renameLiteral(not.getBody(), renamings);
      return GdlPool.getNot(body);
    }
  }

  private GdlOr renameOr(GdlOr or, Map<GdlVariable, GdlVariable> renamings)
  {
    if (or.isGround())
    {
      return or;
    }
    else
    {
      List<GdlLiteral> disjuncts = new ArrayList<GdlLiteral>();
      for (int i = 0; i < or.arity(); i++)
      {
        disjuncts.add(renameLiteral(or.get(i), renamings));
      }

      return GdlPool.getOr(disjuncts);
    }
  }

  private GdlProposition renameProposition(GdlProposition proposition, Map<GdlVariable, GdlVariable> renamings)
  {
    return proposition;
  }

  private GdlRelation renameRelation(GdlRelation relation, Map<GdlVariable, GdlVariable> renamings)
  {
    if (relation.isGround())
    {
      return relation;
    }
    else
    {
      GdlConstant name = renameConstant(relation.getName(), renamings);

      List<GdlTerm> body = new ArrayList<GdlTerm>();
      for (int i = 0; i < relation.arity(); i++)
      {
        body.add(renameTerm(relation.get(i), renamings));
      }

      return GdlPool.getRelation(name, body);
    }
  }

  private GdlRule renameRule(GdlRule rule, Map<GdlVariable, GdlVariable> renamings)
  {
    if (rule.isGround())
    {
      return rule;
    }
    else
    {
      GdlSentence head = renameSentence(rule.getHead(), renamings);

      List<GdlLiteral> body = new ArrayList<GdlLiteral>();
      for (int i = 0; i < rule.arity(); i++)
      {
        body.add(renameLiteral(rule.get(i), renamings));
      }

      return GdlPool.getRule(head, body);
    }
  }

  private GdlSentence renameSentence(GdlSentence sentence, Map<GdlVariable, GdlVariable> renamings)
  {
    if (sentence instanceof GdlProposition)
    {
      return renameProposition((GdlProposition) sentence, renamings);
    }
    else
    {
      return renameRelation((GdlRelation) sentence, renamings);
    }
  }

  private GdlTerm renameTerm(GdlTerm term, Map<GdlVariable, GdlVariable> renamings)
  {
    if (term instanceof GdlConstant)
    {
      return renameConstant((GdlConstant) term, renamings);
    }
    else if (term instanceof GdlVariable)
    {
      return renameVariable((GdlVariable) term, renamings);
    }
    else
    {
      return renameFunction((GdlFunction) term, renamings);
    }
  }

  private GdlVariable renameVariable(GdlVariable variable, Map<GdlVariable, GdlVariable> renamings)
  {
    if (!renamings.containsKey(variable))
    {
      GdlVariable newName = GdlPool.getVariable("?R" + (nextName++));
      renamings.put(variable, newName);
    }

    return renamings.get(variable);
  }

}
TOP

Related Classes of org.ggp.base.util.prover.aima.renamer.VariableRenamer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.