import { Ternary } from '../../util/logic';
import { AbstractDomain } from './abstract-domain';
import { Bottom } from './lattice';
import { type NumericDomain, NumericalComparator } from './value-abstract-domain';
/** The Top element of the interval domain as interval [-∞, +∞] */
export declare const IntervalTop: IntervalValue;
/** The type of the actual values of the interval domain as tuple of the lower and upper bound */
export type IntervalValue = readonly [lower: number, upper: number];
/** The type of the Top element of the interval domain as interval [-∞, +∞] */
export type IntervalTop = typeof IntervalTop;
/** The type of the Bottom element of the interval domain as {@link Bottom} symbol */
export type IntervalBottom = typeof Bottom;
/** The type of the abstract values of the interval domain that are Top, Bottom, or actual values */
export type IntervalLift = IntervalValue | IntervalBottom;
type IntervalBound<Value extends IntervalLift> = Value extends IntervalValue ? number : number | typeof Bottom;
/**
 * The interval abstract domain as intervals with possibly infinite bounds representing possible numeric values.
 * The Bottom element is defined as {@link Bottom} symbol and the Top element is defined as the interval [-∞, +∞].
 * @template Value - Type of the constraint in the abstract domain (Top, Bottom, or an actual value)
 */
export declare class IntervalDomain<Value extends IntervalLift = IntervalLift> extends AbstractDomain<IntervalValue, IntervalTop, IntervalBottom, Value> implements NumericDomain {
    constructor(value: Value);
    create(value: IntervalLift): this;
    get lower(): IntervalBound<Value>;
    get upper(): IntervalBound<Value>;
    from(...values: number[]): this;
    static top(): IntervalDomain<IntervalTop>;
    static bottom(): IntervalDomain<IntervalBottom>;
    static from(...values: number[]): IntervalDomain;
    top(): this & IntervalDomain<IntervalTop>;
    bottom(): this & IntervalDomain<IntervalBottom>;
    protected equalsValue(this: IntervalDomain<IntervalValue>, other: IntervalDomain<IntervalValue>): boolean;
    protected leqValue(this: IntervalDomain<IntervalValue>, other: IntervalDomain<IntervalValue>): boolean;
    protected joinValue(this: this & IntervalDomain<IntervalValue>, other: IntervalDomain<IntervalValue>): this;
    protected meetValue(this: this & IntervalDomain<IntervalValue>, other: IntervalDomain<IntervalValue>): this;
    protected widenValue(this: this & IntervalDomain<IntervalValue>, other: IntervalDomain<IntervalValue>): this;
    protected narrowValue(this: this & IntervalDomain<IntervalValue>, other: IntervalDomain<IntervalValue>): this;
    satisfies(value: number, comparator?: NumericalComparator): Ternary;
    negate(): this;
    add(other: this | IntervalLift): this;
    subtract(other: this | IntervalLift): this;
    multiply(other: this | IntervalLift): this;
    divide(other: this | IntervalLift): this;
    min(other: this | IntervalLift): this;
    max(other: this | IntervalLift): this;
    /**
     * Extends the lower bound of the current abstract value down to -∞.
     */
    widenDown(): this;
    /**
     * Extends the upper bound of the current abstract value up to +∞.
     */
    widenUp(): this;
    protected jsonify(): unknown;
    protected stringify(this: IntervalDomain<IntervalValue>): string;
    isTop(): this is this & IntervalDomain<IntervalTop>;
    isBottom(): this is this & IntervalDomain<IntervalBottom>;
    isValue(): this is this & IntervalDomain<IntervalValue>;
    isFinite(): this is this & IntervalDomain<IntervalValue>;
}
export {};
