Adding a simplifier.

This commit is contained in:
Naveen Sundar Govindarajulu 2018-06-18 22:05:40 -07:00
parent 32e7a8fe4c
commit 839b3e3172
6 changed files with 107 additions and 14 deletions

View file

@ -90,14 +90,16 @@
(defun setup-snark (&key (time-limit 5) (verbose nil)) (defun setup-snark (&key (time-limit 5) (verbose nil))
(snark:initialize :verbose verbose) (snark:initialize :verbose verbose)
(if (not verbose) (snark-deverbose) ) (if (not verbose) (snark-deverbose) )
(snark:run-time-limit 0.5) (snark:run-time-limit 1)
(snark:assert-supported t) (snark:assert-supported t)
(snark:assume-supported t) (snark:assume-supported t)
(snark:prove-supported t) (snark:prove-supported t)
(snark:use-hyperresolution t) (snark:use-hyperresolution t)
(snark:use-paramodulation t) (snark:use-paramodulation t)
(snark:use-term-ordering :recursive-path)
(snark:use-simplification-by-equalities t)
(snark::declare-code-for-lists) (snark::declare-code-for-lists)
(snark:allow-skolem-symbols-in-answers nil)) (snark:allow-skolem-symbols-in-answers nil))
(defun row-formula (name)) (defun row-formula (name))

View file

@ -19,7 +19,7 @@ import java.util.stream.Collectors;
public class DepthFirstPlanner implements Planner { public class DepthFirstPlanner implements Planner {
private static int MAX_DEPTH = 5; private static int MAX_DEPTH = 6;
private static boolean EXHAUSTIVE_TILL_MAX_DEPTH = false; private static boolean EXHAUSTIVE_TILL_MAX_DEPTH = false;
private boolean USE_METHODS, WORK_FROM_SCRATCH; private boolean USE_METHODS, WORK_FROM_SCRATCH;
@ -200,8 +200,11 @@ public class DepthFirstPlanner implements Planner {
if(optPrecond.isPresent()){ if(optPrecond.isPresent()){
current.addAll(additions);
current.removeAll(current.stream().filter(u-> deletions.stream().anyMatch(d-> Operations.equivalent(background, d, u))).collect(Collectors.toSet()));
current.removeAll(deletions); current.removeAll(deletions);
current.addAll(additions.stream().map(Simplifier::simplify).collect(Collectors.toSet()));
expectedStates.add(State.initializeWith(current)); expectedStates.add(State.initializeWith(current));
} else { } else {

View file

@ -241,7 +241,7 @@ public class Operations {
Set<Formula> newFormulae = Sets.union(background, state.getFormulae()); Set<Formula> newFormulae = Sets.union(background, state.getFormulae());
newFormulae = Sets.union(newFormulae, action.instantiateAdditions(binding)); newFormulae = Sets.union(newFormulae, action.instantiateAdditions(binding).stream().map(Simplifier::simplify).collect(Collectors.toSet()));
newFormulae = Sets.difference(newFormulae, formulaeToRemove); newFormulae = Sets.difference(newFormulae, formulaeToRemove);

View file

@ -0,0 +1,85 @@
package com.naveensundarg.planner;
import com.naveensundarg.shadow.prover.representations.formula.Formula;
import com.naveensundarg.shadow.prover.representations.formula.Predicate;
import com.naveensundarg.shadow.prover.representations.value.Compound;
import com.naveensundarg.shadow.prover.representations.value.Constant;
import com.naveensundarg.shadow.prover.representations.value.Value;
import java.util.Arrays;
import java.util.function.Function;
public class Simplifier {
public static Formula simplify(Formula input){
if(input instanceof Predicate){
Value[] args = ((Predicate) input).getArguments();
Value[] outputArgs = new Value[args.length];
for(int i = 0; i < args.length; i++){
outputArgs[i] = simplify(args[i]);
}
return new Predicate(((Predicate) input).getName(), outputArgs);
}
return input;
}
public static Value simplify(Value input){
if(input instanceof Compound && input.getName().equals("remove")){
Value item = input.getArguments()[0];
Value list = input.getArguments()[1];
Value answer = removeFromCons(item, list);
return answer;
} else {
return input;
}
}
private static Value removeFromCons(Value item, Value list) {
if(list.equals(new Constant("el"))){
return new Constant("el");
}
else if (list instanceof Compound && list.getName().equals("cons")) {
if(list.getArguments()[0].equals(item)){
return removeFromCons(item, list.getArguments()[1]);
} else {
return new Compound("cons", new Value[]{list.getArguments()[0], removeFromCons(item, list.getArguments()[1])});
}
}
return list;
};
}

View file

@ -3,9 +3,13 @@ package com.naveensundarg.planner.utils;
import com.naveensundarg.planner.DepthFirstPlanner; import com.naveensundarg.planner.DepthFirstPlanner;
import com.naveensundarg.planner.PlanMethod; import com.naveensundarg.planner.PlanMethod;
import com.naveensundarg.planner.Planner; import com.naveensundarg.planner.Planner;
import com.naveensundarg.planner.Simplifier;
import com.naveensundarg.shadow.prover.representations.formula.Predicate;
import java.util.List; import java.util.List;
import static com.naveensundarg.shadow.prover.utils.Reader.readFormulaFromString;
/** /**
* Created by naveensundarg on 12/22/17. * Created by naveensundarg on 12/22/17.
*/ */
@ -42,6 +46,8 @@ public class Sandbox {
public static void main(String[] args) throws com.naveensundarg.shadow.prover.utils.Reader.ParsingException { public static void main(String[] args) throws com.naveensundarg.shadow.prover.utils.Reader.ParsingException {
List<PlanningProblem> planningProblemList = (PlanningProblem.readFromFile(Sandbox.class.getResourceAsStream("../problems/tora/attend.clj"))); List<PlanningProblem> planningProblemList = (PlanningProblem.readFromFile(Sandbox.class.getResourceAsStream("../problems/tora/attend.clj")));
Planner depthFirstPlanner = new DepthFirstPlanner(); Planner depthFirstPlanner = new DepthFirstPlanner();
@ -49,12 +55,10 @@ public class Sandbox {
PlanningProblem planningProblem = planningProblemList.stream().filter(problem -> problem.getName().equals("soda can challenge 2")).findFirst().get(); PlanningProblem planningProblem = planningProblemList.stream().filter(problem -> problem.getName().equals("soda can challenge 2")).findFirst().get();
depthFirstPlanner.plan(planningProblem.getBackground(), planningProblem.getActions(), planningProblem.getStart(), planningProblem.getGoal()).ifPresent( depthFirstPlanner.plan(planningProblem.getBackground(), planningProblem.getActions(), planningProblem.getStart(), planningProblem.getGoal()).ifPresent(plans-> {
y->{
System.out.println(y); plans.stream().forEach(System.out::println);
} });
);

View file

@ -34,9 +34,8 @@
(attend c)] (attend c)]
:actions [;; checkbehind an object :actions [;; checkbehind an object
(define-action attend [?item] (define-action attend [?item ?list]
{:preconditions [(member ?item ?list) {:preconditions [(and (state ?list) (member ?item ?list))]
(state ?list)]
:additions [(attend ?item) :additions [(attend ?item)
(state (remove ?item ?list))] (state (remove ?item ?list))]
:deletions [(state ?list)]})]} :deletions [(state ?list)]})]}