Ни одна из этих вещей не предназначена для непосредственного использования; вот почему метод Approximation предлагает удобный слой над ними.
Есть такая функция, как real_to_float
. Его имя float_of
, но в нем нет кодовых уравнений, поэтому вы не сможете его использовать. Можно было бы доказать для него кодовое уравнение, но это было бы немного утомительно.
Что касается других ваших вопросов: Да, последний параметр - это список, в котором i-й элемент - это интервал, в котором, как известно, находится значение i-й переменной.
И да, approx
выполняет интервальную арифметику; на самом деле, это является основой того, что он делает. Он работает исключительно на интервалах. Пример, который вы упомянули, можно наблюдать, например, когда x + y
, где x
в [1;2]
и y
в [-1;2]
:
value "approx 10 (Add (Var 0) (Var 1))
[Some (Float 1 0, Float 1 1), Some (Float (-1) 0, Float 1 1)]"
, который возвращает интервал [0;4]
:
"Some (Float 0 0, Float 2 1)"
:: "(float × float) option"
или, точнее:
lemma "(x :: real) ∈ {1..2} ⟹ y ∈ {-1..2} ⟹ x + y ∈ {0..4}"
by (approximation 10)