use of com.sri.ai.expresso.type.FunctionType in project aic-expresso by aic-sri-international.
the class GrinderUtil method isTypeSubtypeOf.
/**
* Test if a type is a subtype of another type.
*
* @param type the type to test if it is a subtype.
* @param ofType type to be tested if a subtype of.
*
* @return true if 'type' is a subtype of 'ofType', false otherwise.
*/
public static boolean isTypeSubtypeOf(Type type, Type ofType) {
boolean result = false;
if (type.equals(ofType)) {
result = true;
} else {
if (type instanceof FunctionType && ofType instanceof FunctionType) {
FunctionType typeFunctionType = (FunctionType) type;
FunctionType ofTypeFunctionType = (FunctionType) ofType;
if (typeFunctionType.getArity() == ofTypeFunctionType.getArity()) {
result = isTypeSubtypeOf(typeFunctionType.getCodomain(), ofTypeFunctionType.getCodomain()) && IntStream.range(0, typeFunctionType.getArity()).allMatch(idx -> isTypeSubtypeOf(ofTypeFunctionType.getArgumentTypes().get(idx), typeFunctionType.getArgumentTypes().get(idx)));
}
} else if (type instanceof TupleType && ofType instanceof TupleType) {
TupleType typeTupleType = (TupleType) type;
TupleType ofTypeTupleType = (TupleType) ofType;
if (typeTupleType.getArity() == ofTypeTupleType.getArity()) {
result = IntStream.range(0, typeTupleType.getArity()).allMatch(idx -> isTypeSubtypeOf(typeTupleType.getElementTypes().get(idx), ofTypeTupleType.getElementTypes().get(idx)));
}
} else if (type instanceof IntegerInterval) {
IntegerInterval typeIntegerInterval = (IntegerInterval) type;
if (ofType instanceof IntegerInterval) {
IntegerInterval ofTypeIntegerInterval = (IntegerInterval) ofType;
result = ofTypeIntegerInterval.isSuperset(typeIntegerInterval.getNonStrictLowerBound(), typeIntegerInterval.getNonStrictUpperBound());
} else if (ofType instanceof RealInterval) {
RealInterval ofTypeRealInterval = (RealInterval) ofType;
result = ofTypeRealInterval.isSuperset(typeIntegerInterval.getNonStrictLowerBound(), typeIntegerInterval.getNonStrictUpperBound());
} else if (ofType instanceof IntegerExpressoType || ofType instanceof RealExpressoType) {
result = true;
}
} else if (type instanceof IntegerExpressoType) {
if (ofType instanceof IntegerInterval) {
IntegerInterval ofTypeIntegerInterval = (IntegerInterval) ofType;
result = ofTypeIntegerInterval.noLowerBound() && ofTypeIntegerInterval.noUpperBound();
} else if (ofType instanceof RealInterval) {
RealInterval ofTypeRealInterval = (RealInterval) ofType;
result = ofTypeRealInterval.noLowerBound() && ofTypeRealInterval.noUpperBound();
} else if (ofType instanceof RealExpressoType) {
result = true;
}
} else if (type instanceof RealInterval) {
RealInterval typeRealInterval = (RealInterval) type;
if (ofType instanceof RealInterval) {
RealInterval ofTypeRealInterval = (RealInterval) ofType;
result = ofTypeRealInterval.isSuperset(typeRealInterval.getLowerBound(), typeRealInterval.getUpperBound());
} else if (ofType instanceof RealExpressoType) {
result = true;
}
} else if (type instanceof RealExpressoType) {
if (ofType instanceof RealInterval) {
RealInterval ofTypeRealInterval = (RealInterval) ofType;
result = ofTypeRealInterval.noLowerBound() && ofTypeRealInterval.noUpperBound();
} else if (ofType instanceof RealExpressoType) {
result = true;
}
}
}
return result;
}
use of com.sri.ai.expresso.type.FunctionType in project aic-expresso by aic-sri-international.
the class TypeTest method testIsFinite.
@Test
public void testIsFinite() {
//
// Categorical type tests
Assert.assertFalse(new Categorical("UnknownCardCatType", -1).isFinite());
Assert.assertFalse(new Categorical("InfiniteCardCatType", -2).isFinite());
Assert.assertTrue(new Categorical("CardCatType", 0).isFinite());
Assert.assertTrue(new Categorical("CardCatType", 100).isFinite());
//
// Integer type tests
Assert.assertFalse(new IntegerExpressoType().isFinite());
//
// Real type tests
Assert.assertFalse(new RealExpressoType().isFinite());
//
// Integer Interval type tests
Assert.assertFalse(new IntegerInterval("Integer").isFinite());
Assert.assertFalse(new IntegerInterval("integer_Interval(-infinity, inifinity)").isFinite());
Assert.assertFalse(new IntegerInterval("integer_Interval(-10, inifinity)").isFinite());
Assert.assertFalse(new IntegerInterval("integer_Interval(-infinity, 10)").isFinite());
Assert.assertTrue(new IntegerInterval("integer_Interval(-10, 10)").isFinite());
//
// Real Interval type tests
Assert.assertFalse(new RealInterval("Real").isFinite());
Assert.assertFalse(new RealInterval("[-infinity;infinity]").isFinite());
Assert.assertFalse(new RealInterval("[-10;infinity]").isFinite());
Assert.assertFalse(new RealInterval("[-infinity;10]").isFinite());
Assert.assertFalse(new RealInterval("[0;1]").isFinite());
//
// Function Type
Assert.assertFalse(new FunctionType(new IntegerExpressoType()).isFinite());
Assert.assertFalse(new FunctionType(new RealExpressoType()).isFinite());
Assert.assertTrue(new FunctionType(new Categorical("Cat", 10)).isFinite());
Assert.assertTrue(new FunctionType(new IntegerInterval(1, 3)).isFinite());
Assert.assertFalse(new FunctionType(new IntegerInterval("Integer")).isFinite());
Assert.assertFalse(new FunctionType(new RealInterval("Real")).isFinite());
Assert.assertTrue(new FunctionType(new TupleType(new IntegerInterval(1, 3))).isFinite());
Assert.assertFalse(new FunctionType(new TupleType(new RealInterval("Real"))).isFinite());
//
Assert.assertFalse(new FunctionType(new IntegerExpressoType(), new Categorical("Cat", 10)).isFinite());
Assert.assertFalse(new FunctionType(new IntegerExpressoType(), new RealExpressoType()).isFinite());
Assert.assertFalse(new FunctionType(new RealExpressoType(), new IntegerExpressoType()).isFinite());
Assert.assertFalse(new FunctionType(new Categorical("Cat", 10), new IntegerExpressoType()).isFinite());
Assert.assertFalse(new FunctionType(new Categorical("Cat", 10), new RealExpressoType()).isFinite());
Assert.assertFalse(new FunctionType(new IntegerInterval("Integer"), new IntegerExpressoType()).isFinite());
Assert.assertTrue(new FunctionType(new IntegerInterval(1, 2), new IntegerInterval(3, 5)).isFinite());
Assert.assertFalse(new FunctionType(new IntegerInterval("Integer"), new RealExpressoType()).isFinite());
Assert.assertFalse(new FunctionType(new RealInterval("Real")).isFinite());
Assert.assertFalse(new FunctionType(new RealInterval("Real"), new IntegerExpressoType()).isFinite());
//
// Tuple Type
Assert.assertFalse(new TupleType(new IntegerExpressoType()).isFinite());
Assert.assertFalse(new TupleType(new RealExpressoType()).isFinite());
Assert.assertTrue(new TupleType(new Categorical("Cat", 10)).isFinite());
Assert.assertTrue(new TupleType(new IntegerInterval(1, 3)).isFinite());
Assert.assertFalse(new TupleType(new IntegerInterval("Integer")).isFinite());
Assert.assertFalse(new TupleType(new RealInterval("Real")).isFinite());
//
Assert.assertFalse(new TupleType(new IntegerExpressoType(), new Categorical("Cat", 10)).isFinite());
Assert.assertFalse(new TupleType(new IntegerExpressoType(), new RealExpressoType()).isFinite());
Assert.assertFalse(new TupleType(new RealExpressoType(), new IntegerExpressoType()).isFinite());
Assert.assertFalse(new TupleType(new Categorical("Cat", 10), new IntegerExpressoType()).isFinite());
Assert.assertFalse(new TupleType(new Categorical("Cat", 10), new RealExpressoType()).isFinite());
Assert.assertFalse(new TupleType(new IntegerInterval("Integer"), new IntegerExpressoType()).isFinite());
Assert.assertTrue(new TupleType(new IntegerInterval(1, 2), new IntegerInterval(3, 5)).isFinite());
Assert.assertFalse(new TupleType(new IntegerInterval("Integer"), new RealExpressoType()).isFinite());
Assert.assertFalse(new TupleType(new RealInterval("Real")).isFinite());
Assert.assertFalse(new TupleType(new RealInterval("Real"), new IntegerExpressoType()).isFinite());
}
use of com.sri.ai.expresso.type.FunctionType in project aic-expresso by aic-sri-international.
the class TypeTest method testIsDiscrete.
@Test
public void testIsDiscrete() {
//
// Categorical type tests
Assert.assertTrue(new Categorical("UnknownCardCatType", -1).isDiscrete());
Assert.assertTrue(new Categorical("InfiniteCardCatType", -2).isDiscrete());
Assert.assertTrue(new Categorical("CardCatType", 0).isDiscrete());
Assert.assertTrue(new Categorical("CardCatType", 100).isDiscrete());
//
// Integer type tests
Assert.assertTrue(new IntegerExpressoType().isDiscrete());
//
// Real type tests
Assert.assertFalse(new RealExpressoType().isDiscrete());
//
// Integer Interval type tests
Assert.assertTrue(new IntegerInterval("Integer").isDiscrete());
Assert.assertTrue(new IntegerInterval("integer_Interval(-infinity, inifinity)").isDiscrete());
Assert.assertTrue(new IntegerInterval("integer_Interval(-10, inifinity)").isDiscrete());
Assert.assertTrue(new IntegerInterval("integer_Interval(-infinity, 10)").isDiscrete());
Assert.assertTrue(new IntegerInterval("integer_Interval(-10, 10)").isDiscrete());
//
// Real Interval type tests
Assert.assertFalse(new RealInterval("Real").isDiscrete());
Assert.assertFalse(new RealInterval("[-infinity;infinity]").isDiscrete());
Assert.assertFalse(new RealInterval("[-10;infinity]").isDiscrete());
Assert.assertFalse(new RealInterval("[-infinity;10]").isDiscrete());
Assert.assertFalse(new RealInterval("[0;1]").isDiscrete());
//
// Function Type
Assert.assertTrue(new FunctionType(new IntegerExpressoType()).isDiscrete());
Assert.assertFalse(new FunctionType(new RealExpressoType()).isDiscrete());
Assert.assertTrue(new FunctionType(new Categorical("Cat", 10)).isDiscrete());
Assert.assertTrue(new FunctionType(new IntegerInterval("Integer")).isDiscrete());
Assert.assertFalse(new FunctionType(new RealInterval("Real")).isDiscrete());
Assert.assertTrue(new FunctionType(new TupleType(new IntegerExpressoType())).isDiscrete());
Assert.assertFalse(new FunctionType(new TupleType(new RealInterval("Real"))).isDiscrete());
//
Assert.assertTrue(new FunctionType(new IntegerExpressoType(), new Categorical("Cat", 10)).isDiscrete());
Assert.assertFalse(new FunctionType(new IntegerExpressoType(), new RealExpressoType()).isDiscrete());
Assert.assertFalse(new FunctionType(new RealExpressoType(), new IntegerExpressoType()).isDiscrete());
Assert.assertTrue(new FunctionType(new Categorical("Cat", 10), new IntegerExpressoType()).isDiscrete());
Assert.assertFalse(new FunctionType(new Categorical("Cat", 10), new RealExpressoType()).isDiscrete());
Assert.assertTrue(new FunctionType(new IntegerInterval("Integer"), new IntegerExpressoType()).isDiscrete());
Assert.assertFalse(new FunctionType(new IntegerInterval("Integer"), new RealExpressoType()).isDiscrete());
Assert.assertFalse(new FunctionType(new RealInterval("Real")).isDiscrete());
Assert.assertFalse(new FunctionType(new RealInterval("Real"), new IntegerExpressoType()).isDiscrete());
//
// Tuple Type
Assert.assertTrue(new TupleType().isDiscrete());
Assert.assertTrue(new TupleType(new IntegerExpressoType()).isDiscrete());
Assert.assertFalse(new TupleType(new RealExpressoType()).isDiscrete());
Assert.assertTrue(new TupleType(new Categorical("Cat", 10)).isDiscrete());
Assert.assertTrue(new TupleType(new IntegerInterval("Integer")).isDiscrete());
Assert.assertFalse(new TupleType(new RealInterval("Real")).isDiscrete());
//
Assert.assertTrue(new TupleType(new IntegerExpressoType(), new Categorical("Cat", 10)).isDiscrete());
Assert.assertFalse(new TupleType(new IntegerExpressoType(), new RealExpressoType()).isDiscrete());
Assert.assertFalse(new TupleType(new RealExpressoType(), new IntegerExpressoType()).isDiscrete());
Assert.assertTrue(new TupleType(new Categorical("Cat", 10), new IntegerExpressoType()).isDiscrete());
Assert.assertFalse(new TupleType(new Categorical("Cat", 10), new RealExpressoType()).isDiscrete());
Assert.assertTrue(new TupleType(new IntegerInterval("Integer"), new IntegerExpressoType()).isDiscrete());
Assert.assertFalse(new TupleType(new IntegerInterval("Integer"), new RealExpressoType()).isDiscrete());
Assert.assertFalse(new TupleType(new RealInterval("Real")).isDiscrete());
Assert.assertFalse(new TupleType(new RealInterval("Real"), new IntegerExpressoType()).isDiscrete());
}
use of com.sri.ai.expresso.type.FunctionType in project aic-expresso by aic-sri-international.
the class SetOfArgumentTuplesForFunctionOccurringInExpression method compute.
public static Expression compute(Expression fName, FunctionType fType, Expression e) {
List<Expression> unionArgs = new ArrayList<>();
Predicate<Expression> isF = expr -> expr.equals(fName);
Predicate<Expression> isFApplication = expr -> expr.hasFunctor(fName) && expr.numberOfArguments() == fType.getArity();
computeUnionArgs(unionArgs, isF, fType, isFApplication, e);
Expression result = makeUnion(unionArgs);
return result;
}
use of com.sri.ai.expresso.type.FunctionType in project aic-expresso by aic-sri-international.
the class SetOfArgumentTuplesForFunctionOccurringInExpression method computeUnionArgs.
private static void computeUnionArgs(List<Expression> unionArgs, Predicate<Expression> isF, FunctionType fType, Predicate<Expression> isFApplication, Expression e) {
// if E does not contain ƒ, oc<sub>ƒ</sub>[E] is ∅
if (!containsF(e, isF)) {
unionArgs.add(Sets.EMPTY_SET);
} else // if E is ƒ(t) for t a tuple, oc<sub>ƒ</sub>[E] is {t}
if (isFApplication.apply(e)) {
Expression tupleT = Expressions.makeTuple(e.getArguments());
Expression setT = ExtensionalSets.makeUniSet(tupleT);
unionArgs.add(setT);
} else // if E is ƒ, oc<sub>ƒ</sub>[E] is Α
if (isF.apply(e)) {
List<Expression> domainTypes = new ArrayList<>();
for (Type domainType : fType.getArgumentTypes()) {
domainTypes.add(Expressions.parse(domainType.getName()));
}
Expression tupleT = Expressions.makeTuple(domainTypes);
Expression setT = ExtensionalSets.makeUniSet(tupleT);
unionArgs.add(setT);
} else // if E is g(E′) for g a function symbol distinct from ƒ and t a k-tuple of expressions
if (Expressions.isFunctionApplicationWithArguments(e)) {
// if g(E′) is if C the E<sub>1</sub> else E<sub>2</sub> and C does not contain ƒ
if (IfThenElse.isIfThenElse(e) && !containsF(IfThenElse.condition(e), isF)) {
// then oc<sub>ƒ</sub>[E] is<br>
// if C then oc<sub>ƒ</sub>[E<sub>1</sub>] else oc<sub>ƒ</sub>[E<sub>2</sub>]
Expression e1 = IfThenElse.thenBranch(e);
List<Expression> thenUnionArgs = new ArrayList<>();
computeUnionArgs(thenUnionArgs, isF, fType, isFApplication, e1);
Expression thenBranch = makeUnion(thenUnionArgs);
Expression e2 = IfThenElse.elseBranch(e);
List<Expression> elseUnionArgs = new ArrayList<>();
computeUnionArgs(elseUnionArgs, isF, fType, isFApplication, e2);
Expression elseBranch = makeUnion(elseUnionArgs);
Expression ifThenElse = IfThenElse.make(IfThenElse.condition(e), thenBranch, elseBranch);
unionArgs.add(ifThenElse);
} else {
// oc<sub>ƒ</sub>[t<sub>1</sub>] ∪ … ∪ oc<sub>ƒ</sub>[t<sub>k</sub>]
for (Expression t : e.getArguments()) {
computeUnionArgs(unionArgs, isF, fType, isFApplication, t);
}
}
} else // quantified expression,
if (isArbitraryQuantifier(e) && !containsF(getQuantifierCondition(e), isF)) {
// then oc<sub>ƒ</sub>[E] is<br>
// ⋃<sub>x:C</sub>oc<sub>ƒ</sub>[E′]
QuantifiedExpression q = (QuantifiedExpression) e;
IndexExpressionsSet x = q.getIndexExpressions();
Expression c = getQuantifierCondition(e);
Expression ePrime = getQuantifiedExpression(q);
List<Expression> ePrimeUnionArgs = new ArrayList<>();
computeUnionArgs(ePrimeUnionArgs, isF, fType, isFApplication, ePrime);
Expression ocfOfEPrime = makeUnion(ePrimeUnionArgs);
Expression intensionalMultiSet = IntensionalSet.intensionalMultiSet(x, ocfOfEPrime, c);
Expression intensionalUnion = Expressions.apply(FunctorConstants.INTENSIONAL_UNION, intensionalMultiSet);
unionArgs.add(intensionalUnion);
} else // quantified expression,
if (isArbitraryQuantifier(e)) {
// then oc<sub>ƒ</sub>[E] is<br>
// ⋃<sub>x</sub>(oc<sub>ƒ</sub>[C] ∪ oc<sub>ƒ</sub>[E′])
QuantifiedExpression q = (QuantifiedExpression) e;
IndexExpressionsSet x = q.getIndexExpressions();
Expression c = getQuantifierCondition(e);
Expression ePrime = getQuantifiedExpression(q);
List<Expression> conditionUnionArgs = new ArrayList<>();
computeUnionArgs(conditionUnionArgs, isF, fType, isFApplication, c);
List<Expression> ePrimeUnionArgs = new ArrayList<>();
computeUnionArgs(ePrimeUnionArgs, isF, fType, isFApplication, ePrime);
List<Expression> combinedUnionArgs = new ArrayList<>();
combinedUnionArgs.addAll(conditionUnionArgs);
combinedUnionArgs.addAll(ePrimeUnionArgs);
Expression combinedUnion = makeUnion(combinedUnionArgs);
Expression intensionalMultiSet = IntensionalSet.intensionalMultiSet(x, combinedUnion, Expressions.TRUE);
Expression intensionalUnion = Expressions.apply(FunctorConstants.INTENSIONAL_UNION, intensionalMultiSet);
unionArgs.add(intensionalUnion);
} else {
throw new UnsupportedOperationException("Do not have logic for handling expression of the form: " + e);
}
}
Aggregations