Esempio n. 1
0
 /**
  * {<M --> S>, <M --> P>} |- <<#x --> S> ==> <#x --> P>> {<M --> S>, <M --> P>} |- <<#x --> S> <=>
  * <#x --> P>>
  *
  * @param sentence1 The first premise <M --> S>
  * @param sentence2 The second premise <M --> P>
  * @param figure The figure indicating the location of the shared term
  * @param isImplication The conclusion is Implication, not Equivalence
  */
 private static RDFStatement introVarInd(
     Sentence sentence1, Sentence sentence2, int figure, boolean isImplication) {
   RDFStatement premise1 = (RDFStatement) sentence1.getContent();
   RDFStatement premise2 = (RDFStatement) sentence2.getContent();
   RDFStatement state1, state2;
   Variable v1 = new Variable(Symbols.VARIABLE_TAG + "0");
   Variable v2 = new Variable(Symbols.VARIABLE_TAG + "0");
   if (figure == 11) {
     state1 = RDFStatement.make(premise1, v1, premise1.getPredicate());
     state2 = RDFStatement.make(premise2, v2, premise2.getPredicate());
   } else {
     state1 = RDFStatement.make(premise1, premise1.getSubject(), v1);
     state2 = RDFStatement.make(premise2, premise2.getSubject(), v2);
   }
   TemporalValue tense1 = sentence1.getTense();
   TemporalValue tense2 = sentence2.getTense();
   TemporalValue tense = TemporalRules.tenseInduction(tense1, tense2);
   if (tense == null) {
     return null;
   }
   RDFStatement content;
   if (isImplication) {
     content = Implication.make(state1, state2, tense);
   } else {
     content = Equivalence.make(state1, state2, tense);
   }
   return content;
 }
Esempio n. 2
0
 /**
  * {<M --> S>, <C ==> <M --> P>>} |- <(&&, <#x --> S>, C) ==> <#x --> P>> {<M --> S>, (&&, C, <M
  * --> P>)} |- (&&, C, <<#x --> S> ==> <#x --> P>>)
  *
  * @param premise1 The first premise directly used in internal induction, <M --> S>
  * @param premise2 The component to be used as a premise in internal induction, <M --> P>
  * @param oldCompound The whole content of the first premise, Implication or Conjunction
  */
 static void introVarIndInner(
     RDFStatement premise1, RDFStatement premise2, CompoundTerm oldCompound) {
   Task task = Memory.currentTask;
   Sentence taskSentence = task.getSentence();
   if (!taskSentence.isJudgment()) {
     return;
   }
   if (premise1.getClass() != premise2.getClass()) {
     return;
   }
   Variable var1 = new Variable(Symbols.VARIABLE_TAG + "0");
   Variable var2 = new Variable(Symbols.VARIABLE_TAG + "0");
   RDFStatement state1, state2;
   if (premise1.getSubject().equals(premise2.getSubject())) {
     state1 = RDFStatement.make(premise1, var1, premise1.getPredicate());
     state2 = RDFStatement.make(premise2, var2, premise2.getPredicate());
   } else if (premise1.getPredicate().equals(premise2.getPredicate())) {
     state1 = RDFStatement.make(premise1, premise1.getSubject(), var1);
     state2 = RDFStatement.make(premise2, premise2.getSubject(), var2);
   } else {
     return;
   }
   Sentence belief = Memory.currentBelief;
   Term compound, content;
   TemporalValue tense;
   TruthValue truth;
   if (premise1.equals(taskSentence.getContent())) {
     truth = TruthFunctions.abduction(taskSentence.getTruth(), belief.getTruth());
     tense = TemporalRules.tenseInduction(taskSentence.getTense(), belief.getTense());
   } else {
     truth = TruthFunctions.abduction(belief.getTruth(), taskSentence.getTruth());
     tense = TemporalRules.tenseInduction(belief.getTense(), taskSentence.getTense());
   }
   if (tense == null) {
     return;
   }
   if ((oldCompound instanceof Implication) && (tense == oldCompound.getOrder())) {
     compound = RDFStatement.make((RDFStatement) oldCompound, oldCompound.componentAt(0), state2);
     content = RDFStatement.make((RDFStatement) oldCompound, state1, compound);
   } else if (oldCompound instanceof Conjunction) {
     compound = Implication.make(state1, state2, tense);
     content = CompoundTerm.replaceComponent(oldCompound, premise2, compound);
   } else {
     return;
   }
   BudgetValue budget = BudgetFunctions.forward(truth);
   Memory.doublePremiseTask(budget, content, truth);
 }
Esempio n. 3
0
  /**
   * Extract consequents from a implications at a single program point. It only searches for top
   * level Program points because Implications are produced only at those points.
   */
  public static void extract_consequent_maybe(PptTopLevel ppt, PptMap all_ppts) {
    ppt.simplify_variable_names();

    List<Invariant> invs = new ArrayList<Invariant>();
    if (invs.size() > 0) {
      String pptname = cleanup_pptname(ppt.name());
      for (Invariant maybe_as_inv : invs) {
        Implication maybe = (Implication) maybe_as_inv;

        // don't print redundant invariants.
        if (Daikon.suppress_redundant_invariants_with_simplify
            && maybe.ppt.parent.redundant_invs.contains(maybe)) {
          continue;
        }

        // don't print out invariants with min(), max(), or sum() variables
        boolean mms = false;
        VarInfo[] varbls = maybe.ppt.var_infos;
        for (int v = 0; !mms && v < varbls.length; v++) {
          mms |= varbls[v].isDerivedSequenceMinMaxSum();
        }
        if (mms) {
          continue;
        }

        if (maybe.ppt.parent.ppt_name.isExitPoint()) {
          for (int i = 0; i < maybe.ppt.var_infos.length; i++) {
            VarInfo vi = maybe.ppt.var_infos[i];
            if (vi.isDerivedParam()) {
              continue;
            }
          }
        }

        Invariant consequent = maybe.consequent();
        Invariant predicate = maybe.predicate();
        Invariant inv, cluster_inv;
        boolean cons_uses_cluster = false, pred_uses_cluster = false;
        // extract the consequent (predicate) if the predicate
        // (consequent) uses the variable "cluster".  Ignore if they
        // both depend on "cluster"
        if (consequent.usesVarDerived("cluster")) cons_uses_cluster = true;
        if (predicate.usesVarDerived("cluster")) pred_uses_cluster = true;

        if (!(pred_uses_cluster ^ cons_uses_cluster)) {
          continue;
        } else if (pred_uses_cluster) {
          inv = consequent;
          cluster_inv = predicate;
        } else {
          inv = predicate;
          cluster_inv = consequent;
        }

        if (!inv.isInteresting()) {
          continue;
        }

        if (!inv.isWorthPrinting()) {
          continue;
        }

        if (contains_constant_non_012(inv)) {
          continue;
        }

        // filter out unwanted invariants

        // 1) Invariants involving sequences
        if (inv instanceof daikon.inv.binary.twoSequence.TwoSequence
            || inv instanceof daikon.inv.binary.sequenceScalar.SequenceScalar
            || inv instanceof daikon.inv.binary.sequenceString.SequenceString
            || inv instanceof daikon.inv.unary.sequence.SingleSequence
            || inv instanceof daikon.inv.unary.stringsequence.SingleStringSequence) {
          continue;
        }

        if (inv instanceof daikon.inv.ternary.threeScalar.LinearTernary
            || inv instanceof daikon.inv.binary.twoScalar.LinearBinary) {
          continue;
        }

        String inv_string = inv.format_using(OutputFormat.JAVA);
        if (orig_pattern.matcher(inv_string).find()
            || dot_class_pattern.matcher(inv_string).find()) {
          continue;
        }
        String fake_inv_string = simplify_inequalities(inv_string);
        HashedConsequent real = new HashedConsequent(inv, null);
        if (!fake_inv_string.equals(inv_string)) {
          // For instance, inv_string is "x != y", fake_inv_string is "x == y"
          HashedConsequent fake = new HashedConsequent(inv, inv_string);
          boolean added =
              store_invariant(
                  cluster_inv.format_using(OutputFormat.JAVA), fake_inv_string, fake, pptname);
          if (!added) {
            // We couldn't add "x == y", (when we're "x != y") because
            // it already exists; so don't add "x == y" either.
            continue;
          }
        }
        store_invariant(cluster_inv.format_using(OutputFormat.JAVA), inv_string, real, pptname);
      }
    }
  }
Esempio n. 4
0
 /**
  * {<M ==> S>, <M ==> P>} |- {<S ==> P>,
  *
  * <P ==>S>, <S <=> P>}
  *
  * @param task1 The first premise
  * @param task2 The second premise
  * @param order Temporal order of the terms in conclusion
  */
 public static void temporalIndCom(Task task1, Task task2, TemporalValue order) {
   Judgment judg1 = (Judgment) task1.getSentence();
   Judgment judg2 = (Judgment) task2.getSentence();
   Stamp stamp = Stamp.make(judg1.getStamp(), judg2.getStamp());
   if (stamp == null) {
     return;
   }
   Memory.currentStamp = stamp;
   Term term1 = judg1.getContent();
   Term term2 = judg2.getContent();
   if ((term1 instanceof Inheritance) && (term2 instanceof Inheritance)) {
     RDFStatement s1 = (RDFStatement) term1;
     RDFStatement s2 = (RDFStatement) term2;
     Variable var1 = new Variable(Symbols.VARIABLE_TAG + "0");
     Variable var2 = new Variable(Symbols.VARIABLE_TAG + "0");
     if (s1.getSubject().equals(s2.getSubject())) {
       term1 = RDFStatement.make(s1, var1, s1.getPredicate());
       term2 = RDFStatement.make(s2, var2, s2.getPredicate());
     } else if (s1.getPredicate().equals(s2.getPredicate())) {
       term1 = RDFStatement.make(s1, s1.getSubject(), var1);
       term2 = RDFStatement.make(s2, s2.getSubject(), var2);
     }
   } else { // to generalize
     Term condition;
     if ((term1 instanceof Implication) && (term2 instanceof Inheritance)) {
       condition = ((Implication) term1).getSubject();
       if (condition.equals(term2)) {
         return;
       }
       if ((condition instanceof Conjunction)
           && ((Conjunction) condition).containComponent(term2)) {
         return;
       }
     } else if ((term1 instanceof Inheritance) && (term2 instanceof Implication)) {
       condition = ((Implication) term2).getSubject();
       if (condition.equals(term1)) {
         return;
       }
       if ((condition instanceof Conjunction)
           && ((Conjunction) condition).containComponent(term1)) {
         return;
       }
     }
   }
   RDFStatement statement1 = Implication.make(term1, term2, order);
   RDFStatement statement2 = Implication.make(term2, term1, TemporalValue.getReverse(order));
   RDFStatement statement3 = Equivalence.make(term1, term2, order);
   TruthValue value1 = judg1.getTruth();
   TruthValue value2 = judg2.getTruth();
   TruthValue truth1 = TruthFunctions.induction(value1, value2);
   TruthValue truth2 = TruthFunctions.induction(value2, value1);
   TruthValue truth3 = TruthFunctions.comparison(value1, value2);
   BudgetValue budget1 =
       BudgetFunctions.temporalIndCom(task1.getBudget(), task2.getBudget(), truth1);
   BudgetValue budget2 =
       BudgetFunctions.temporalIndCom(task1.getBudget(), task2.getBudget(), truth2);
   BudgetValue budget3 =
       BudgetFunctions.temporalIndCom(task1.getBudget(), task2.getBudget(), truth3);
   Memory.currentTense = new TemporalValue(0);
   Memory.doublePremiseTask(budget1, statement1, truth1);
   Memory.doublePremiseTask(budget2, statement2, truth2);
   Memory.doublePremiseTask(budget3, statement3, truth3);
 }
Esempio n. 5
0
 /**
  * {<(&&, S1, S2, S3) ==> P>, S1} |- <(&&, S2, S3) ==> P> {<(&&, S2, S3) ==> P>, <S1 ==> S2>} |-
  * <(&&, S1, S3) ==> P> {<(&&, S1, S3) ==> P>, <S1 ==> S2>} |- <(&&, S2, S3) ==> P>
  *
  * @param premise1 The conditional premise
  * @param index The location of the shared term in the condition of premise1
  * @param premise2 The premise which, or part of which, appears in the condition of premise1
  * @param side The location of the shared term in premise2: 0 for subject, 1 for predicate, -1 for
  *     the whole term
  */
 static void conditionalDedInd(Implication premise1, short index, Term premise2, int side) {
   Task task = Memory.currentTask;
   Sentence taskSentence = task.getSentence();
   Judgment belief = Memory.currentBelief;
   boolean deduction = (side != 0);
   HashMap substitute =
       Variable.findSubstitute(Variable.VarType.ALL, premise2, belief.getContent());
   boolean conditionalTask = (substitute != null);
   TemporalValue tense1 = (conditionalTask ? taskSentence.getTense() : belief.getTense());
   TemporalValue tense2 = (conditionalTask ? belief.getTense() : taskSentence.getTense());
   TemporalValue order1 = premise1.getOrder();
   TemporalValue order2 = premise2.getOrder();
   if ((side == -1) && (tense2 != null) && (tense2.getDelta() > 0)) {
     return;
   }
   if ((side == 0) && (order2 != null) && (order2.getDelta() > 0)) {
     return;
   }
   if ((side == 1) && (order2 != null) && (order2.getDelta() < 0)) {
     return;
   }
   TemporalValue tense = TemporalRules.syllogistic(tense1, tense2);
   if (tense != null) {
     tense = new TemporalValue(0);
   }
   Term commonComponent;
   Term newComponent = null;
   if (side == 0) {
     commonComponent = ((RDFStatement) premise2).getSubject();
     newComponent = ((RDFStatement) premise2).getPredicate();
   } else if (side == 1) {
     commonComponent = ((RDFStatement) premise2).getPredicate();
     newComponent = ((RDFStatement) premise2).getSubject();
   } else {
     commonComponent = premise2;
   }
   Conjunction oldCondition = (Conjunction) premise1.getSubject();
   boolean match =
       Variable.unify(
           Variable.VarType.INDEPENDENT,
           oldCondition.componentAt(index),
           commonComponent,
           premise1,
           premise2);
   if (!match && (commonComponent.getClass() == oldCondition.getClass())) {
     match =
         Variable.unify(
             Variable.VarType.INDEPENDENT,
             oldCondition.componentAt(index),
             ((CompoundTerm) commonComponent).componentAt(index),
             premise1,
             premise2);
   }
   if (!match) {
     return;
   }
   Term newCondition;
   if (oldCondition.equals(commonComponent)) {
     newCondition = null;
   } else {
     newCondition = CompoundTerm.replaceComponent(oldCondition, index, newComponent);
     if ((newCondition instanceof Conjunction) && ((CompoundTerm) newCondition).size() == 1) {
       newCondition = ((CompoundTerm) newCondition).componentAt(0);
     }
   }
   Term content;
   if (newCondition != null) {
     content = RDFStatement.make(premise1, newCondition, premise1.getPredicate(), order1);
   } else {
     content = premise1.getPredicate();
   }
   if (content == null) {
     return;
   }
   TruthValue truth1 = taskSentence.getTruth();
   TruthValue truth2 = belief.getTruth();
   TruthValue truth = null;
   BudgetValue budget;
   if (taskSentence instanceof Question) {
     budget = BudgetFunctions.backwardWeak(truth2);
   } else {
     if (taskSentence instanceof Goal) {
       if (conditionalTask) {
         truth = TruthFunctions.desireWeak(truth1, truth2);
       } else if (deduction) {
         truth = TruthFunctions.desireInd(truth1, truth2);
       } else {
         truth = TruthFunctions.desireDed(truth1, truth2);
       }
       budget = BudgetFunctions.forward(truth);
     } else {
       if (deduction) {
         truth = TruthFunctions.deduction(truth1, truth2);
       } else if (conditionalTask) {
         truth = TruthFunctions.induction(truth2, truth1);
       } else {
         truth = TruthFunctions.induction(truth1, truth2);
       }
     }
     budget = BudgetFunctions.forward(truth);
   }
   Memory.currentTense = tense;
   Memory.doublePremiseTask(budget, content, truth);
 }