Поскольку Cons
расширяет TCons
, вы можете рассматривать this
как экземпляр TCons
в любом месте предиката члена Cons
. Это означает, что вы можете сравнить this
с конкретным экземпляром TCons
и связать переменные с параметрами конструктора.
override string toString() {
exists(int x, List xs |
this = TCons(x, xs) and
result = x.toString() + ":" + xs.toString()
)
}
Поскольку вы, вероятно, захотите использовать параметры конструктора в других предикатах-членах из Cons
, вы можете вместо этого объявить поля , чтобы захватить параметры конструктора один раз в предикате характеристики c, а затем использовать их в предикатах-членах:
class Cons extends List, TCons {
int x;
List xs;
Cons() {
this = TCons(x, xs)
}
override string toString() {
result = x.toString() + ":" + xs.toString()
}
}
Просто напоминание: как указывает страница справочника QL, на которую вы ссылаетесь, синтаксис типов алгебраических данных c в QL все еще является экспериментальным и может быть изменен.