Newer
Older
RDLProofSystem / src / main / java / models / terms / meta / MetaDynamicDependency.java
@Sakoda2269 Sakoda2269 7 hours ago 2 KB dynami 修正 途中まで
package models.terms.meta;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import models.algebra.Expression;
import models.algebra.Variable;
import models.terms.RDLTerm;

public class MetaDynamicDependency extends MetaDependency implements MetaDynamicTerm {

	private final MetaTermGenerator termGenerator;
	
	public MetaDynamicDependency(MetaTermGenerator termGenerator) {
		this.termGenerator = termGenerator;
	}
	
	public MetaDynamicDependency(MetaTermGenerator termGenerator, List<? extends RDLTerm> terms) {
		this.termGenerator = termGenerator;
		this.dependingTerm = terms.size() > 0 ? terms.get(0) : null;
		this.dependedTerms = terms.size() > 1 ? terms.stream().skip(1).toList() : List.of();
		for (RDLTerm term : terms) {
			addChild(term);
		}
	}
	
	public MetaDynamicDependency(MetaTermGenerator termGenerator, RDLTerm ...terms) {
		this(termGenerator, Arrays.asList(terms));
	}
	
	@Override
	public MetaRDLTerm generate(int depth, Map<Variable, Object> context) {
		// TODO 自動生成されたメソッド・スタブ
		return null;
	}

	@Override
	public MetaDependency generate(int depth, int maxIndex, int maxDepth, Map<Variable, Object> context) {
		if (maxIndex < 2) return null;
		RDLTerm dependingTerm = this.dependingTerm == null ? termGenerator.generate(0, depth, maxIndex, maxDepth, context) : this.dependingTerm;
		while (dependingTerm instanceof MetaDynamicTerm dynamicTerm) {
			dependingTerm = dynamicTerm.generate(depth + 1, maxIndex, maxDepth, context);
		}
		List<RDLTerm> dependedTerms = new ArrayList<>();
		int staticSize = this.dependedTerms == null ? 0 : this.dependedTerms.size();
		for (int i = 0; i < Math.min(maxIndex - 1, staticSize); i++) {
			dependedTerms.add(this.dependedTerms.get(i));
		}
		for (int i = staticSize; i < maxIndex - 1; i++) {
			RDLTerm generatedTerm = termGenerator.generate(i + 1, depth, maxIndex, maxDepth, context);
			while (generatedTerm instanceof MetaDynamicTerm dynamicTerm) {
				generatedTerm = dynamicTerm.generate(depth + 1, maxIndex, maxDepth, context);
			}
			dependedTerms.add(generatedTerm);
		}
		return new MetaDependency(dependingTerm, dependedTerms);
	}
	
	
	@Override
	protected Set<MatchConstraint> isMatchedBy(RDLTerm another, MatchConstraint constraint, int depth) {
		return null;
	}

	@Override
	protected RDLTerm substitute(Map<Variable, RDLTerm> binding, int depth) {
		// TODO 自動生成されたメソッド・スタブ
		return null;
	}

	
	@Override
	public String toString() {
		if (dependingTerm != null) {
			return "[" + 
				getChild(0).toString() + " : " + 
					getChildren().stream().skip(1).map(Expression::toString).collect(Collectors.joining(",")) + 
					" ...? ]";
		}
		return "[ ...? ]";
	}
}