package org.ggp.base.util.gdl.model.assignments; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import org.ggp.base.util.gdl.GdlUtils; import org.ggp.base.util.gdl.grammar.GdlConstant; import org.ggp.base.util.gdl.grammar.GdlLiteral; import org.ggp.base.util.gdl.grammar.GdlRule; import org.ggp.base.util.gdl.grammar.GdlSentence; import org.ggp.base.util.gdl.grammar.GdlVariable; import org.ggp.base.util.gdl.model.SentenceDomainModel; import org.ggp.base.util.gdl.model.SentenceDomainModels; import org.ggp.base.util.gdl.model.SentenceDomainModels.VarDomainOpts; import org.ggp.base.util.gdl.model.SentenceForm; public class AssignmentsFactory { private AssignmentsFactory() { } public static Assignments getAssignmentsForRule(GdlRule rule, SentenceDomainModel model, Map<SentenceForm, FunctionInfo> functionInfoMap, Map<SentenceForm, ? extends Collection<GdlSentence>> completedSentenceFormValues) { return new AssignmentsImpl(rule, SentenceDomainModels.getVarDomains(rule, model, VarDomainOpts.INCLUDE_HEAD), functionInfoMap, completedSentenceFormValues); } public static Assignments getAssignmentsForRule(GdlRule rule, Map<GdlVariable, Set<GdlConstant>> varDomains, Map<SentenceForm, FunctionInfo> functionInfoMap, Map<SentenceForm, ? extends Collection<GdlSentence>> completedSentenceFormValues) { return new AssignmentsImpl(rule, varDomains, functionInfoMap, completedSentenceFormValues); } public static Assignments getAssignmentsWithRecursiveInput(GdlRule rule, SentenceDomainModel model, SentenceForm form, GdlSentence input, Map<SentenceForm, FunctionInfo> functionInfoMap, Map<SentenceForm, ? extends Collection<GdlSentence>> completedSentenceFormValues) { //Look for the literal(s) in the rule with the sentence form of the //recursive input. This can be tricky if there are multiple matching //literals. List<GdlSentence> matchingLiterals = new ArrayList<GdlSentence>(); for(GdlLiteral literal : rule.getBody()) if(literal instanceof GdlSentence) if(form.matches((GdlSentence) literal)) matchingLiterals.add((GdlSentence) literal); List<Assignments> assignmentsList = new ArrayList<Assignments>(); for(GdlSentence matchingLiteral : matchingLiterals) { //left has the variables, right has the constants Map<GdlVariable, GdlConstant> preassignment = GdlUtils.getAssignmentMakingLeftIntoRight(matchingLiteral, input); if(preassignment != null) { Assignments assignments = new AssignmentsImpl( preassignment, rule, //TODO: This one getVarDomains call is why a lot of //SentenceModel/DomainModel stuff is required. Can //this be better factored somehow? SentenceDomainModels.getVarDomains(rule, model, VarDomainOpts.INCLUDE_HEAD), functionInfoMap, completedSentenceFormValues); assignmentsList.add(assignments); } } if(assignmentsList.isEmpty()) return new AssignmentsImpl(); if(assignmentsList.size() == 1) return assignmentsList.get(0); throw new RuntimeException("Not yet implemented: assignments for recursive functions with multiple recursive conjuncts"); //TODO: Plan to implement by subclassing Assignments into something //that contains and iterates over multiple Assignments } //TODO: Put the constructor that uses the SentenceModel here }