proposit-core
    Preparing search index...

    Interface TExpressionMutations<TArg, TPremise, TExpr, TVar>

    Single-premise expression tree mutations.

    interface TExpressionMutations<
        TArg extends TCoreArgument = TCoreArgument,
        TPremise extends TCorePremise = TCorePremise,
        TExpr extends TCorePropositionalExpression = TCorePropositionalExpression,
        TVar extends TCorePropositionalVariable = TCorePropositionalVariable,
    > {
        addExpression(
            expression: TExpressionInput<TExpr>,
        ): TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>;
        addExpressionRelative(
            siblingId: string,
            relativePosition: "before" | "after",
            expression: TExpressionWithoutPosition<TExpr>,
        ): TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>;
        appendExpression(
            parentId: string | null,
            expression: TExpressionWithoutPosition<TExpr>,
        ): TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>;
        changeOperator(
            expressionId: string,
            newOperator: "not" | "and" | "or" | "xor" | "implies" | "iff",
            sourceChildId?: string,
            targetChildId?: string,
            extraFields?: Partial<TExpr>,
        ): TCoreMutationResult<TExpr | null, TExpr, TVar, TPremise, TArg>;
        insertExpression(
            expression: TExpressionInput<TExpr>,
            leftNodeId?: string,
            rightNodeId?: string,
        ): TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>;
        removeExpression(
            expressionId: string,
            deleteSubtree: boolean,
        ): TCoreMutationResult<TExpr | undefined, TExpr, TVar, TPremise, TArg>;
        toggleNegation(
            expressionId: string,
            extraFields?: Partial<TExpr>,
        ): TCoreMutationResult<TExpr | null, TExpr, TVar, TPremise, TArg>;
        updateExpression(
            expressionId: string,
            updates: TExpressionUpdate,
        ): TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>;
        wrapExpression(
            operator: TExpressionWithoutPosition<TExpr>,
            newSibling: TExpressionWithoutPosition<TExpr>,
            leftNodeId?: string,
            rightNodeId?: string,
        ): TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>;
    }

    Type Parameters

    Implemented by

    Index

    Methods

    • Adds an expression to this premise's tree.

      If the expression has parentId: null it becomes the root; only one root is permitted per premise. All Structural rules (implies/iff root-only, child limits, position uniqueness, derivation root operator) are enforced at mutation time.

      P-1 (non-not operator under operator) is not enforced at mutation time — the AN-1 post-hook in assistive behavior inserts the formula buffer; in permissive behavior the un-buffered state stays and surfaces via engine.validate('presentable').

      Parameters

      Returns TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>

      The added expression (with checksum) and changeset.

      If the premise already has a root expression and this one is also a root.

      If the expression's parent does not exist in this premise.

      If the expression is a variable reference and the variable has not been registered.

    • Adds an expression immediately before or after an existing sibling, with position computed automatically.

      Composite-mutation behavior (S-9): sibling positions are always shifted as part of the bundled op when the computed midpoint position would collide with an existing sibling. Only the minimal set of nodes is repositioned. Repositioned siblings appear in changes.expressions.modified.

      Parameters

      • siblingId: string

        The ID of the existing sibling expression.

      • relativePosition: "before" | "after"

        Whether to insert "before" or "after" the sibling.

      • expression: TExpressionWithoutPosition<TExpr>

        The expression to add (position is auto-assigned).

      Returns TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>

      The added expression (with checksum) and changeset.

      If the sibling does not exist in this premise.

      If the expression is a variable reference and the variable has not been registered.

    • Adds an expression as the last child of the given parent, with position computed automatically. If parentId is null, the expression becomes the root.

      Composite-mutation behavior (S-9): sibling positions are always shifted as part of the bundled op when the computed position would collide with an existing sibling. Repositioned siblings appear in changes.expressions.modified.

      Parameters

      • parentId: string | null

        The parent expression ID, or null for root.

      • expression: TExpressionWithoutPosition<TExpr>

        The expression to add (position is auto-assigned).

      Returns TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>

      The added expression (with checksum) and changeset.

      If the premise already has a root and parentId is null.

      If the expression is a variable reference and the variable has not been registered.

    • Changes the operator type of an existing operator expression.

      Handles three structural cases automatically:

      • Simple change: Updates the operator type in place, keeping its id, children and their positions. Applies when the operator has fewer than 3 children and no merge applies, or when it has more, newOperator is and, or or xor, and neither child id is given — those take any number of operands, so the whole node swaps. In assistive mode the post-mutation normalization may then absorb the node into a same-operator parent, as after any change.
      • Merge: The operator has fewer than 2 children and its parent (or its grandparent, through a formula buffer) is the same type as newOperator. Dissolves the current operator and reparents its children under that operator.
      • Split: The operator has >2 children and both child ids are given. Extracts sourceChildId and targetChildId into a new sub-operator of type newOperator, inserting a formula buffer between the parent and the new sub-operator (the buffer is part of the bundled composite mutation so the resulting tree satisfies P-1 regardless of the engine's behavior setting). implies and iff cannot be split out this way, since they must be roots.

      Parameters

      • expressionId: string

        The operator expression to change.

      • newOperator: "not" | "and" | "or" | "xor" | "implies" | "iff"

        The target operator type.

      • OptionalsourceChildId: string

        First child to include in a split. Required, with targetChildId, to split an operator with >2 children; omit both to swap it in place.

      • OptionaltargetChildId: string

        Second child to include in a split.

      • OptionalextraFields: Partial<TExpr>

        Optional partial expression fields merged into any newly created expressions (formula buffer, new sub-operator). Structural fields (id, type, operator, parentId, position, premiseId, argumentId, argumentVersion) cannot be overridden.

      Returns TCoreMutationResult<TExpr | null, TExpr, TVar, TPremise, TArg>

      result — For simple change: the updated operator expression. For merge, or a simple change that assistive normalization then absorbed: null (the operator no longer exists). For split: the newly created sub-operator expression. changes — Full changeset with correct hierarchical checksums.

      If the expression does not exist, is not an operator, or is "not".

      If >2 children and only one of sourceChildId/targetChildId is given, or neither is and newOperator is implies or iff. An empty string counts as given.

      If >2 children and newOperator is implies or iff: the split-out sub-operator would not be a root.

      If sourceChildId/targetChildId are not children of expressionId.

    • Splices a new expression between existing nodes in the tree. The new expression inherits the tree slot of the anchor node (leftNodeId ?? rightNodeId).

      P-1 (non-not operator under operator) is not enforced at mutation time — the AN-1 post-hook in assistive behavior inserts the formula buffer; in permissive behavior the un-buffered state stays and surfaces via engine.validate('presentable').

      Parameters

      • expression: TExpressionInput<TExpr>

        The expression to insert, including position and parent assignment.

      • OptionalleftNodeId: string

        The existing node to become the left child of the new expression.

      • OptionalrightNodeId: string

        The existing node to become the right child of the new expression.

      Returns TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>

      The inserted expression (with checksum) and changeset.

      If the expression is a variable reference and the variable has not been registered.

    • Removes an expression and optionally its entire descendant subtree.

      This method does not collapse the surviving parent — AN-3 (post-mutation hook in assistive mode) handles 0/1-child operator/formula collapse on the surviving parent.

      Parameters

      • expressionId: string

        The ID of the expression to remove.

      • deleteSubtree: boolean

        Whether to remove all descendants as well.

      Returns TCoreMutationResult<TExpr | undefined, TExpr, TVar, TPremise, TArg>

      The removed root expression, or undefined if not found.

      If deleteSubtree is false and the single surviving child is a root-only operator (implies/iff) that would be placed in a non-root position (S-5).

    • Toggles negation on an expression. If the expression's parent is a NOT operator, removes the NOT (promoting the expression). Otherwise, wraps the expression with a new NOT operator.

      P-1 (non-not operator under operator) and P-2 (NOT(NOT(x)) double-negation) are not enforced at mutation time. The post-mutation AN hook handles them in assistive behavior: AN-1 inserts the formula buffer between NOT and a non-not operator child; AN-2 collapses NOT(NOT(x)) → x. In permissive behavior both states stay and surface via engine.validate('presentable').

      Parameters

      • expressionId: string

        The ID of the expression to toggle negation on.

      • OptionalextraFields: Partial<TExpr>

        Optional additional fields to merge into newly created expressions (NOT and formula nodes). Structural fields (id, type, operator, parentId, position, premiseId, argumentId, argumentVersion) cannot be overridden.

      Returns TCoreMutationResult<TExpr | null, TExpr, TVar, TPremise, TArg>

      The new NOT expression when adding negation, or null when removing it, along with the changeset.

      If the expression does not exist in this premise.

    • Wraps an existing expression with a new operator and a new sibling in a single atomic operation.

      The operator takes the existing node's slot in the tree. Both the existing node and the new sibling become children of the operator. Exactly one of leftNodeId / rightNodeId must be provided — it identifies the existing node and which child slot it occupies.

      P-1 (non-not operator under operator) is not enforced at mutation time — the AN-1 post-hook in assistive behavior inserts the formula buffer; in permissive behavior the un-buffered state stays and surfaces via engine.validate('presentable').

      Parameters

      • operator: TExpressionWithoutPosition<TExpr>

        The new operator expression to wrap with.

      • newSibling: TExpressionWithoutPosition<TExpr>

        The new sibling expression to add alongside the existing node.

      • OptionalleftNodeId: string

        The existing node to place as the left child.

      • OptionalrightNodeId: string

        The existing node to place as the right child.

      Returns TCoreMutationResult<TExpr, TExpr, TVar, TPremise, TArg>

      The inserted operator (with checksum) and changeset.

      If the new sibling is a variable reference and the variable has not been registered.