проверка предиката в dafny истинна для всех целых чисел

Я новичок в dafny и пытаюсь проверить, является ли каждое целое число четным или нечетным. У меня есть код ниже:

method Main() {
  
  Test();
  
  
}


predicate Test (a : int)

{
  
  assert (forall a :: a % 2 == 0 || a % 2 != 0);
  
  
}

Но Дафни жалуется, что мой предикат неверен, и я не знаю, почему. Любая помощь приветствуется.


person Arthur    schedule 08.09.2020    source источник
comment
Привет, было ли сообщение об ошибке?   -  person IronMan    schedule 09.09.2020
comment
да, Dafny 2.3.0.10506 stdin.dfy(16,0): ошибка: в stdin.dfy обнаружены недопустимые ошибки синтаксического анализа LogicalExpression 1   -  person Arthur    schedule 09.09.2020


Ответы (1)


predicate отличается от method тем, что тело predicate должно быть выражением. Например, если вы удалите ключевое слово assert и точку с запятой в конце этой строки, она будет правильно проанализирована.

Кроме того, здесь есть еще несколько проблем. Во-первых, похоже, что Test объявлено принимающим параметр a, но вызов из Main не передает значение для этого параметра. Вы имели в виду, что Test не принимает никаких параметров? Во-вторых, чтобы вызвать predicate из method, вы должны объявить predicate как predicate method, что аналогично predicate, за исключением того, что его можно вызывать из methods.

person James Wilcox    schedule 09.09.2020
comment
Привет Джеймс, спасибо за ваш отзыв. Я пытаюсь проверить в dafny, что каждое целое число либо нечетное, либо четное, поэтому я не хочу передавать целое число в качестве аргумента, а хочу каким-то образом показать, что все целые числа действительно подчиняются этому свойству. - person Arthur; 09.09.2020
comment
Я не уверен, как бы я это сделал - person Arthur; 09.09.2020
comment
метод Main (x : int) { assert (x % 2 == 0 || x % 2 == 1); } - person Arthur; 09.09.2020
comment
вроде разобрался! - person James Wilcox; 09.09.2020
comment
другой способ сделать это: method Main() { assert (forall x :: x % 2 == 0 || x % 2 == 1); } - person James Wilcox; 09.09.2020