package org.archstudio.prolog.op.iso; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; 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; import com.google.common.collect.Sets; public class Sort extends ComplexTerm implements Executable { public Sort(String name, List<? extends Term> terms) { super(name, 2, terms); } @Override public Iterable<Map<VariableTerm, Term>> execute(final ProofContext proofContext, final UnificationEngine unificationEngine, Term source, final Map<VariableTerm, Term> variables) { Term in = getTerm(0).resolve(proofContext, variables); Term out = getTerm(1); Set<Term> inTerms = Sets.newHashSet(((ListTerm) in).asList()); List<Term> outTerms = Lists.newArrayList(inTerms); Collections.sort(outTerms); UnificationContext context = new UnificationContext(proofContext, out, ListTerm.asListTerm(outTerms), variables); if (unificationEngine.unifies(proofContext, context)) { return Collections.singleton(context.variables); } return Collections.emptyList(); } }