import { TermFn, PBool, PLam, PDelayed } from "../../../PTypes/index.js";
import { Term } from "../../../Term/index.js";
import { TermType, ToPType } from "../../../type_system/index.js";
import { UtilityTermOf } from "../../std/UtilityTerms/addUtilityForType.js";
import { PappArg } from "../../pappArg.js";
import { TermBool } from "../../std/UtilityTerms/TermBool.js";
export declare function pstrictIf<ReturnT extends TermType>(returnType: ReturnT): TermFn<[PBool, ToPType<ReturnT>, ToPType<ReturnT>], ToPType<ReturnT>>;
export declare function pif<ReturnT extends TermType>(returnType?: ReturnT | undefined): Term<PLam<PBool, PLam<ToPType<ReturnT>, PLam<ToPType<ReturnT>, ToPType<ReturnT>>>>> & {
    $: (condition: PappArg<PBool>) => Term<PLam<ToPType<ReturnT>, PLam<ToPType<ReturnT>, ToPType<ReturnT>>>> & {
        then: (caseTrue: PappArg<ToPType<ReturnT>>) => TermFn<[ToPType<ReturnT>], ToPType<ReturnT>> & {
            else: (caseFalse: PappArg<ToPType<ReturnT>>) => UtilityTermOf<ToPType<ReturnT>>;
        };
        $: (caseTrue: PappArg<ToPType<ReturnT>>) => TermFn<[ToPType<ReturnT>], ToPType<ReturnT>> & {
            else: (caseFalse: PappArg<ToPType<ReturnT>>) => UtilityTermOf<ToPType<ReturnT>>;
        };
    };
};
export declare const pnot: Term<PLam<PBool, PBool>> & {
    $: (bool: PappArg<PBool>) => TermBool;
};
export declare const pstrictAnd: Term<PLam<PBool, PLam<PBool, PBool>>> & {
    $: (bool: PappArg<PBool>) => Term<PLam<PBool, PBool>> & {
        $: (bool: PappArg<PBool>) => TermBool;
    };
};
export declare const pand: Term<PLam<PBool, PLam<PDelayed<PBool>, PBool>>> & {
    $: (bool: PappArg<PBool>) => Term<PLam<PDelayed<PBool>, PBool>> & {
        $: (bool: PappArg<PDelayed<PBool>>) => TermBool;
    };
};
export declare const pstrictOr: Term<PLam<PBool, PLam<PBool, PBool>>> & {
    $: (bool: PappArg<PBool>) => Term<PLam<PBool, PBool>> & {
        $: (bool: PappArg<PBool>) => TermBool;
    };
};
export declare const por: Term<PLam<PBool, PLam<PDelayed<PBool>, PBool>>> & {
    $: (bool: PappArg<PBool>) => Term<PLam<PDelayed<PBool>, PBool>> & {
        $: (bool: PappArg<PDelayed<PBool>>) => TermBool;
    };
};
export declare const peqBool: Term<PLam<PBool, PLam<PBool, PBool>>> & {
    $: (bool: PappArg<PBool>) => Term<PLam<PBool, PBool>> & {
        $: (bool: PappArg<PBool>) => TermBool;
    };
};
