While checking some edge case results for get-model against the standard, I noticed that there is a discrepancy between the SMT-LIB standard and what every existing implementation does.
According to the standard, the answer to (get-model) should just be a list of (define-fun...) commands, e.g.
(get-model)
; ( (define-fun x () Int 0) (define-fun y () Int 1) )
However, every current solver adds an additional model keyword in the answer:
(get-model)
; (model (define-fun x () Int 0) (define-fun y () Int 1) )
The post-processor for the model-validation track in SMT-COMP actually checks that the "model" keyword is present. Thus it rejects standard conform models.
So should we keep the standard and fix all tools, or should we change the standard? I personally like the standard better, since it avoids adding another keyword and it follows the pattern of other commands like get-value or get-unsat-core that just print a list.
However, changing all solvers may break existing tools that parse the output of these solvers. To allow a smooth transition, it would be possible to allow an optional "model" in the model parser, so that it works with both current and standard conform solvers.
Cheers,
Jochen