Я определил тип данных сигма-алгебры в Dafny, как показано ниже:
datatype Alg = Empty | Complement(a: Alg) | Union(b: Alg, c: Alg) | Set(s: set<int>)
class test {
var S : set<int>
function eval(X: Alg) : set<int> // evaluates an algebra
reads this;
decreases X;
{
match X
case Empty => {}
case Complement(a) => S - eval(X.a)
case Union(b,c) => eval(X.b) + eval(X.c)
case Set(s) => X.s
}
}
Я хочу указать свойства, которые количественно определяют индуктивный тип данных. Можно ли так выразить свойства?
Вот пример того, что я пробовал:
lemma algebra()
ensures exists x :: x in Alg ==> eval(x) == {};
ensures forall x :: x in Alg ==> eval(x) <= S;
ensures forall x :: x in Alg ==> exists y :: y in Alg && eval(y) == S - eval(x);
ensures forall b,c :: b in Alg && c in Alg ==> exists d :: d in Alg && eval(d) == eval(b) + eval(c);
Но я получаю сообщение об ошибке:
второй аргумент "in" должен быть набором, мультимножеством или последовательностью с элементами типа Alg или картой с доменом Alg.
Я хочу заявить такие свойства, как: "существует такая алгебра, что..." или "для всех алгебр...".