import { Variable } from "./language";
export interface EvaluationContext {
    get(variableName: string): number | boolean | undefined;
}
export declare class ValueMap extends Map<string, number | boolean> implements EvaluationContext {
    constructor(...keyValues: Array<string | number | boolean>);
    static toEntryPairs(keyValues: Array<string | number | boolean>): Iterable<readonly [string, number | boolean]>;
}
/**
 * Numeric expression.
 */
export declare abstract class NumericExpression {
    abstract getVariables(): Variable[];
    abstract evaluate(context: EvaluationContext): number | undefined;
    getVariableNames(): string[];
}
export declare class VariableExpression extends NumericExpression {
    readonly name: string;
    readonly variable: Variable;
    constructor(name: string);
    getVariables(): Variable[];
    evaluate(context: EvaluationContext): number | undefined;
}
export declare class NumericLiteral extends NumericExpression {
    readonly value: number;
    constructor(value: number);
    getVariables(): Variable[];
    evaluate(context: EvaluationContext): number | undefined;
}
export declare abstract class BinaryExpression extends NumericExpression {
    readonly operator: string;
    readonly left: NumericExpression;
    readonly right: NumericExpression;
    constructor(operator: string, left: NumericExpression, right: NumericExpression);
    getVariables(): Variable[];
}
export declare abstract class NAryExpression extends NumericExpression {
    readonly operator: string;
    readonly children: NumericExpression[];
    constructor(operator: string, children: NumericExpression[]);
    getVariables(): Variable[];
    abstract reduce(left: number | undefined, right: number | undefined): number | undefined;
    abstract identity(): number;
    evaluate(context: EvaluationContext): number | undefined;
}
export declare class Sum extends NAryExpression {
    constructor(children: NumericExpression[]);
    reduce(left: number | undefined, right: number | undefined): number | undefined;
    identity(): number;
}
export declare class Subtraction extends BinaryExpression {
    constructor(left: NumericExpression, right: NumericExpression);
    evaluate(context: EvaluationContext): number | undefined;
}
export declare class Product extends NAryExpression {
    constructor(children: NumericExpression[]);
    reduce(left: number | undefined, right: number | undefined): number | undefined;
    identity(): number;
}
export declare class Division extends BinaryExpression {
    constructor(left: NumericExpression, right: NumericExpression);
    evaluate(context: EvaluationContext): number | undefined;
}
