-
Notifications
You must be signed in to change notification settings - Fork 33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Review AC(X) implementation #989
Comments
Noting here something I noticed that might be useful when coming back to this issue: the implementation of let color ac =
match ac.Sig.l with
| [(_, 1)] -> assert false
| _ ->
let p = unsafe_ac_to_arith ac in
if not ac.distribute then
if has_ac p (fun ac -> is_mult ac.h) then X.ac_embed ac
else is_mine p
else
let xp = is_mine p in
if contains_a_fresh_alien xp then
let l, _ = P.to_list p in
let mx = max_list_ l in
if mx = 0 || mx = 1 || number_of_vars ac.l > mx then is_mine p
else X.ac_embed ac
else xp We are doing something different whether we "contain a fresh alien" (i.e. a term with namespace "Fresh" i.e. a term created with When we hit this code with fresh names that are not introduced for AC(X) purposes, weird things (and incompleteness) seem to happen. I don't have a simple example at the moment; this occurred while debugging seemingly unrelated code with
We are able to prove unsat from a critical pair here, but we still introduce an AC rewrite rule of the form Footnotes
|
Another note to self regarding #1172: this is maybe the wrong approach, because we still do different behavior depending on whether we have an AC-introduced constant for a top symbol that is not a multiplication. But maybe we must not do distributivity in that case either, I am not sure. Needs more thinking/review. |
Need to understand:
The AC(X) paper: https://arxiv.org/pdf/1207.3262.pdf
The text was updated successfully, but these errors were encountered: