Приведенная ниже программа возвращает unsat при запуске на z3.
(assert ( forall ( (y (Array Int Int)) )
(= (select y 1) 0)
))
(check-sat)
Я не понимаю, что на самом деле означает строка forall; Значит ли это, что для всех массивов - Int y [Int], есть ли возможность y[1] == 0 ? Если да, то SAT, иначе UNSAT? Почему z3 возвращает unsat, когда я запускаю приведенный выше код?
Вот код C, который я написал для Seahorn, соответствующий вышеуказанному файлу smt2.
#include "seahorn/seahorn.h"
extern int nd();
int main(void){
int n = nd();
assume(n>0);
int y[n];
for(int i = 0; i < n; i++)
{
sassert(y[1]=0);
}
}
Я преобразовал код C в файл smt2 с помощью Seahorn, а затем отформатировал его с помощью format.py из CHC Comp 2020, а затем запустил z3 в отформатированном файле, который дает - unsat.
Хотя ответ обоих файлов одинаков, я не думаю, что это правильный код. В исходном файле smt2 указано Forall array y, тогда как мой код c говорит, что для всех элементов массива y. Как мне написать правильный код C для этой проблемы?
[Обратите внимание: я ссылался на учебник z3, но все равно не ясно]