Иногда наиболее естественный способ написания формулы не содержит действительных триггеров, как это было в вашем первоначальном примере. В этом случае Дафни предупредит вас. Иногда проверка в любом случае будет успешной, но в больших программах вам часто придется исправлять эти предупреждения. Хорошая общая стратегия состоит в том, чтобы ввести новую функцию, абстрактную часть квантифицированной формулы, которая может служить триггером.

учаю предупреждение в Дафни, в котором говорится, что мои квантификаторы имеют

No terms found to trigger on.

Что я пытаюсь сделать для своего кода, так это найти наибольшее число, имеющее квадратное значение, которое меньше или равно заданному натуральному числу «n». Вот код, который я придумал до сих пор:

method sqrt(n : nat) returns (r: int)
  // square less than or equal to n
  ensures (r * r) <= n 
  // largest number
  ensures forall i :: 0 <= i < r ==> (i * i) < (r * r)
{
    var i := 0; // increasing number
    r := 0;
    while ((i*i) <= n)
      invariant (r*r) <= n
      invariant forall k :: 0 <= k < r ==> (k*k) < (r*r)
      decreases n - i
    {
      r := i;
      i := i + 1;
    }

    return r;
}

В этом фрагменте я проверяю, что возвращаю значение с квадратным значением, которое меньше или равно n, используя постусловиеensures (r * r) <= n.

я такжепытаясь чтобы убедиться, что возвращаемое значение действительно является наибольшим значением, имеющим квадратное значение, которое меньше или равно 'n', с помощью квантификатораforall i :: 0 <= i < r ==> (i*i) < (r*r)

Этот квантификатор означает, что все элементы, которые были до 'r', имеют квадратное значение, которое меньше квадратного значения r.

Как исправитьNo terms found to trigger on.? Что это на самом деле означает?

Дафни говорит мне, что это предупреждение. Значит ли это, что мои кванторы неверны? или это означает, что Дафни вообще не может это проверить, но это правильно?

Ответы на вопрос(1)

Ваш ответ на вопрос