"""Prescriptive reasoning: define and solve decision problems.

Provides a declarative Python API for formulating decision problems — optimization,
constraint satisfaction, or feasibility — and solving them with external solvers
(HiGHS, Gurobi, Ipopt, MiniZinc, etc.).

## Quick Start

    from relationalai.semantics import Model, Float, Integer
    from relationalai.semantics.reasoners.prescriptive import Problem

    model = Model("my_problem")
    p = Problem(model, Float)  # Float for HiGHS/Gurobi/Ipopt, Integer for MiniZinc

    x = model.Relationship(f"{Float:x}")
    y = model.Relationship(f"{Float:y}")
    p.solve_for(x, name="x", lower=0, upper=10)
    p.solve_for(y, name="y", lower=0, upper=10)

    p.minimize(x**2 + y**2)
    p.satisfy(model.require(x + y >= 5))
    p.solve("highs")

## Exports

    Problem: Define decision variables, objectives, constraints, and solve.
    all_different: Global constraint for pairwise distinct values.
    implies: Logical implication constraint (left => right).
    special_ordered_set_type_1: SOS1 constraint (at most one variable non-zero).
    special_ordered_set_type_2: SOS2 constraint for piecewise-linear modeling.
"""

from __future__ import annotations

from .problem import (
    Problem,
    all_different,
    implies,
    special_ordered_set_type_1,
    special_ordered_set_type_2,
)

# Package version.
__version__ = "0.0.0"

__all__ = [
    "Problem",
    "all_different",
    "implies",
    "special_ordered_set_type_1",
    "special_ordered_set_type_2",
]
