Newer
Older
RDLProofSystem / src / main / java / inference / axioms / CompositeMapping.java
@Sakoda2269 Sakoda2269 5 days ago 3 KB 公理実装完了
package inference.axioms;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import exceptions.SubstituteFailedException;
import inference.InferenceRule;
import models.Position;
import models.algebra.Variable;
import models.formulas.Formula;
import models.formulas.meta.MetaDependencyFormula;
import models.terms.meta.MatchConstraint;
import models.terms.meta.MetaDynamicDependency;
import models.terms.meta.MetaEvaluatableTermVariable;
import models.terms.meta.MetaRDLTerm;
import models.terms.meta.MetaTermGenerator;

public class CompositeMapping extends InferenceRule {

	public CompositeMapping() {
		super("Composite Mapping");
		
		assumptions.add(
				new MetaDependencyFormula(
						new MetaDynamicDependency(
								new MetaTermGenerator() {
									@Override
									public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map<Object, Object> context) {
										curIndex -= 1;
										context.put("k", curIndex + 1);
										return new MetaEvaluatableTermVariable(new Variable("ue" + curIndex));
									}
								},
								new MetaEvaluatableTermVariable(new Variable("te"))
						)
				)
		);
		
		assumptions.add(
				new MetaDependencyFormula(
						new MetaDynamicDependency(
								new MetaTermGenerator() {
									@Override
									public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map<Object, Object> context) {
										curIndex -= 2;
										context.put("n", curIndex + 1);
										return new MetaEvaluatableTermVariable(new Variable("ve" + curIndex));
									}
								},
								new MetaEvaluatableTermVariable(new Variable("se")),
								new MetaEvaluatableTermVariable(new Variable("te"))
						)
				)
		);
		
		conclusion = new MetaDependencyFormula(
				new MetaDynamicDependency(
						new MetaTermGenerator() {
							@Override
							public MetaRDLTerm generate(int curIndex, int curDepth, int maxIndex, int maxDepth, Map<Object, Object> context) {
								curIndex -= 1;
								int k = (Integer) context.get("k");
								if (curIndex < k) {
									return new MetaEvaluatableTermVariable(new Variable("ue" + curIndex));
								}
								curIndex -= k;
								return new MetaEvaluatableTermVariable(new Variable("ve" + curIndex));
							}
						},
						new MetaEvaluatableTermVariable(new Variable("se"))
				)
		);
	}
	
	@Override
	public Set<Formula> derive(List<Formula> assumptions, MatchConstraint constraint) {
		Set<Formula> result = new HashSet<>();
		if (this.assumptions.size() != assumptions.size()) {
			return new HashSet<>();
		}
		
		Set<MatchConstraint> matchResult = assumptionMatch(assumptions, constraint);
		
		for (MatchConstraint res: matchResult) {
			try {
				int k = (Integer) res.getContext().get("k");
				int n = (Integer) res.getContext().get("n");
				res.getContext().put(new Position(), k + n + 1);
				result.add(this.conclusion.substitution(res.getBinding(), res.getContext()));
			} catch (SubstituteFailedException e) {
				continue;
			}
		}
		return result;
	}
	
}