получаване на неизвестен резултат с тривиално forall

Използвам th z3 C++ API. ако създам този прост фалшив израз:

z3::expr x = C->int_const("x");
z3::expr p = z3::forall(x, x==0);

и се опитвам да реша, получавам неизвестен резултат. Не съм експерт по стратегии и тактики, но съм сигурен, че z3 може да реши това, ако използвам правилната тактика.

Аз също опитах

z3::expr p = !z3::forall(x, x==0);

със, разбира се, същия резултат от runknown.


person Giacomo Tagliabue    schedule 18.04.2013    source източник
comment
Вижте свързания въпрос: stackoverflow.com/questions/14988298/   -  person Leonardo de Moura    schedule 19.04.2013


Отговори (1)


Не съм запознат с z3, но от обща гледна точка на C++ няма ли x==0 да оцени първо, т.е. няма ли вашето извикване да е еквивалентно на implies(x, 1)? От бързо търсене изглежда, че може да се наложи да конструирате всяка част от израза като z3 обект, например:

Z3_ast consequent = Z3_mk_eq(ctx, x, 0);
Z3_ast theorem = Z3_mk_implies(ctx, x, consequent);

Но и горното не е правилно. Вярвам, че самите параметри x и 0 трябва да бъдат екземпляри на Z3_ast, които капсулират твърдението, което имате предвид (за разлика от техните интерполирани стойности или препратки).

person slackwing    schedule 18.04.2013
comment
Това не е вярно, това е валидна z3 конструкция. Ако заменя forall с съществува, той се решава на true, както се очаква. може би сте се объркали, защото съм написал израза лошо, съжалявам. Актуализирах го сега. - person Giacomo Tagliabue; 19.04.2013
comment
Хм, вероятно наистина бъркам. Но искаш да кажеш, че z3 претоварва оператора == на C++, след което създава израз от x==0, вместо да го оценява? - person slackwing; 19.04.2013
comment
точно C++ apis прави това ;) той отменя почти всичко - person Giacomo Tagliabue; 19.04.2013