package org.archstudio.prolog.archstudio.ops;
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.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.Sets;
public class Ascending extends ComplexTerm implements Executable {
public Ascending(String name, List<? extends Term> terms) {
super(name, 1, terms);
}
@Override
public Iterable<Map<VariableTerm, Term>> execute(ProofContext proofContext, UnificationEngine unificationEngine,
Term source, Map<VariableTerm, Term> variables) {
Term t = getTerm(0).resolve(proofContext, variables);
if (t instanceof ListTerm) {
ListTerm listTerm = (ListTerm) t;
if (PrologUtils.extractVariables(Sets.<VariableTerm> newHashSet(), t).size() == 0) {
List<Term> list = listTerm.asList();
for (int i = 1; i < list.size(); i++) {
if (list.get(i - 1).compareTo(list.get(i)) >= 0) {
return Collections.emptyList();
}
}
return Collections.singleton(variables);
}
}
return Collections.emptyList();
}
}