2 つの未解釈の関数 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)).
原因がわかりません 回答お待ちしております