Предположим, у нас есть две неинтерпретируемые функции func1 и func2:
stuct_sort func1(struct_sort);
stuct_sort func2(struct_sort ,int).
И у них есть отношения:
func2(p,n)=func1(p) if n==1
func2(p,n)=func1(func2(p,n-1)) if n>1
Я хочу знать, что если следующее предложение:
((forall i:[1,m].func2(p,i)==Z)&&(q==func1(p))) implies (forall i:[1,m-1].func2(q,i)==Z)
может быть доказано в Z3? В моей программе результат проверки равен Z3_L_UNDEF
.
Когда я присваиваю m такое значение, как 3, предложение становится
((forall i:[1,3].func2(p,i)==Z)&&(q==func1(p))) implies (forall i:[1,3-1].func2(q,i)==Z);
результат Z3_L_UNDEF
. Но когда я переписываю случай отдельно (не используя forall) следующим образом, получается true
.
(func2(p,1)==Z)&&(func2(p,2)==Z)&&(func2(p,3)==Z)&&(q==func1(p)) implies (func2(q,1))&&(func2(q,2)).
Не могу понять причину жду ответа