Ho notato un comportamento strano con Z3 4.3.1 quando si lavora con file .smt2.Perché 0 = 0,5?
Se faccio (assert (= 0 0.5))
sarà soddisfacibile. Tuttavia, se cambio l'ordine e faccio (assert (= 0.5 0))
non è soddisfacente.
La mia ipotesi su ciò che sta accadendo è che se il primo parametro è un numero intero, li inserisce entrambi in numeri interi (arrotondando 0,5 fino a 0), quindi esegue il confronto. Se cambio "0" a "0.0" funziona come previsto. Ciò è in contrasto con la maggior parte dei linguaggi di programmazione con cui ho lavorato dove se uno dei parametri è un numero in virgola mobile, entrambi sono espressi su numeri in virgola mobile e confrontati. Questo è davvero il comportamento previsto in Z3?
http://rise4fun.com/z3/tutorial afferma: "... A differenza della maggior parte dei linguaggi di programmazione, Z3 non converte automaticamente gli interi in real e viceversa ..." –
Oki, quindi se non c'è cast implicito, l'asserzione deve essere rifiutata durante il controllo dei tipi. –
@ PetrVepřek chiedendo quali lingue convertiranno automaticamente da 0,5 a 0 quando si asserisce che '0,5 è uguale a 0' ... – MxyL