package org.archstudio.prolog.op.iso; import java.util.Collections; import java.util.List; import java.util.Map; import org.archstudio.prolog.engine.PrologUtils; import org.archstudio.prolog.engine.ProofContext; import org.archstudio.prolog.engine.UnificationContext; import org.archstudio.prolog.engine.UnificationEngine; import org.archstudio.prolog.op.Executable; import org.archstudio.prolog.term.ComplexTerm; import org.archstudio.prolog.term.ListTerm; import org.archstudio.prolog.term.Term; import org.archstudio.prolog.term.VariableTerm; import com.google.common.collect.Lists; public class FindAll extends ComplexTerm implements Executable { public FindAll(String name, List<? extends Term> terms) { super(name, 3, terms); } @Override public Iterable<Map<VariableTerm, Term>> execute(final ProofContext proofContext, final UnificationEngine unificationEngine, Term source, final Map<VariableTerm, Term> variables) { Term template = getTerm(0); Term goal = getTerm(1); Term bag = getTerm(2); List<Term> results = Lists.newArrayList(); for (Map<VariableTerm, Term> result : PrologUtils.resolveExecutable(proofContext, goal, variables).execute( proofContext, unificationEngine, goal, variables)) { results.add(template.resolve(proofContext, result)); } UnificationContext context = new UnificationContext(proofContext, bag, ListTerm.asListTerm(results), variables); if (unificationEngine.unifies(proofContext, context)) { return Collections.singleton(context.variables); } return Collections.emptyList(); } }