You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
type t
type r = { domn : bool ; card : int }
logic a : t
logic b : r
logic f : t -> r
(* no failure if f(a) is replaced by b *)
goal g_18 :
(f(a)).domn ->
false
First, in check_records, we assume that any function that returns a record is a record constructor (and any function of one argument taking a record is a record destructor, although I don't think this actually has an adverse impact except in terms of performance). This is the cause of the crash.
Second, we do not properly keep track of accesses. f(a) is normalized to some constant (say, !k3) by purification, but we only see accesses to f(a).domn as a term, not to !k3.domn, so although we have both the informations that f(a) = !k3 and f(a).domn = true, we don't know that !k3.domn = true.
This is somewhat related to #792 and #793 . A proper fix would probably require re-architecturing at least partially the model generation for record and will have to wait until #776 is merged.
The bug is not present anymore. The current output for the above file is:
(
(define-fun a () t (as @a3 t))
(define-fun b () r (as @a1 r))
(define-fun f ((_arg_0 t)) r (r true 0))
)
which is a correct counter example (the goal becomes true -> false).
Alt-Ergo outputs Valid on the original file. As we do not print anymore models after a timeout, I cannot check if the bug is still there for this file but I believe that it is gone :)
command:
File: bug.ae.zip
Output:
The text was updated successfully, but these errors were encountered: