Использование предикатов в Alloy

Я пытаюсь использовать два предиката (скажем, methodWiThSameParameters и methodWiThSameReturn) из другого (то есть checkOverriding), но я получаю следующую ошибку: "Нет команд для выполнения". Есть какие-нибудь подсказки? Я также пытался использовать функции, но безуспешно, либо из-за синтаксиса, либо из-за того, что функции не возвращают логические значения.

Они являются частью java метамодели, указанной в Alloy, как я прокомментировал в некоторых предыдущих вопросах.

pred checkOverriding[]{
//check accessibility of methods involved in overriding
  no c1, c2: Class {
    c1=c2.^extend
    some m1, m2:Method |
          m1 in c1.methods && m2 in c2.methods && m1.id = m2.id 
          && methodsWiThSameParameters[m1, m2] && methodsWiThSameReturn[m1, m2] && 
               ( (m1.acc = protected && (m2.acc = private_ || #(m2.acc) = 0 )) ||
                 (m1.acc = public && (m2.acc != public || #(m2.acc) = 0 )) ||
                 (#(m1.acc) = 0 && m2.acc != private_ )
               )
      }
    }

pred methodsWiThSameParameters [first,second:Method]{
    m1.param=m2.param || (#(m1.param)=0 && #(m2.param)=0)  
}
pred methodsWiThSameReturn [first, second:Method]{
    m1.return=m2.return || (#(m1.return)=0 && #(m2.return)=0) 
}

Спасибо за ваш ответ, г-н CM Sperberg-McQueen, но я думаю, что я не был достаточно ясен в своем вопросе.

Мой предикат, скажем, checkOverriding, вызывается из факта, подобного этому:

fact chackJavaWellFormednessRules{
    checkOverriding[]
}

Таким образом, я продолжаю не понимать ошибку: "Нет команд для выполнения".

1 ответ

Решение

Вы определили предикаты; у них чисто декларативная семантика, и они будут истинными в некотором подмножестве экземпляров модели и ложными в дополнительном подмножестве.

Если вы хотите, чтобы Анализатор что-то делал, вам нужно дать ему инструкцию; инструкция для поиска экземпляра предиката run, Так что вы хотите сказать что-то вроде

run methodsWithSameParameters for 3

или же

run methodsWithSameParameters for 5
run methodsWithSameReturn for 5

Обратите внимание, что вы можете иметь более одной инструкции в модели Alloy; Анализатор позволяет вам сказать, что выполнить.


[Приложение]

Alloy Analyzer рассматривает ключевые слова run а также check (и только их) как "команды". Из вашего описания, это звучит очень похоже на то, что у вас нет каких-либо вхождений этих ключевых слов в модель.

Если все, что вы хотите сделать, это просмотреть некоторые экземпляры модели Alloy (чтобы убедиться, что модель не является самопротиворечивой), то самый простой способ - добавить в модель что-то вроде следующего:

pred show {}
run show for 3

Или, если у вас уже есть именованный предикат, вы можете просто добавить run команда для этого предиката:

run checkOverriding 

Но без оговорки в модели, которая начинается с run или же check, у вас нет "команды" в модели.

Вы говорите, что вы определили предикат (checkOverriding) и затем указывает на то, что этот предикат всегда выполняется. Это означает, что предикат checkOverriding всегда верно (и может быть сделано с помощью checkOverriding факт вместо предиката), но он имеет чисто декларативное значение и не считается "командой". Если вы хотите, чтобы Alloy находил экземпляры предиката, вы должны использовать run команда; если вы хотите, чтобы Alloy нашел контрпримеры для утверждения, вы должны использовать check команда.

Другие вопросы по тегам