Setting goals
Declaring goals tells Alt-Ergo what it needs to prove.
Alt-Ergo will answer Valid
if it can prove that the formula of the goal is true in all cases, and I don't know
otherwise.
goal
To declare goals, the user can use the following construct. Note that goals must always be named.
Syntax
<goal_declaration> ::= 'goal' <id> ':' <goal_body>
Here, <goal_body>
is an expression which may contain quantifiers.
Examples
logic h, g, f: int, int -> int
logic a, b:int
goal g_1:
h(g(a,a),g(b,b)) = g(b,b) ->
a = b ->
g(f(h(g(a,a),g(b,b)),b) - f(g(b,b),a),
f(h(g(a,a),g(b,b)),a) - f(g(b,b),b)) = g(0,0)
goal g:
forall x,y:int.
x > 3 ->
y = (x + 1) / 2 ->
x < (y + 1) * (y + 1)
Intermediate goals: cut
and check
cut
and check
can be used to create intermediate goals, to check that they can be proven, without using the terms that they generate as known terms for other triggers.
In other word, cut
and check
allow to test if intermediate goals can be proven, without having any influence whatsoever on the behaviour of Alt-Ergo on other goals.
cut
and check
seem to not be supported by Alt-Ergo 2.3.0 (but those keywords are still reserved).
[WIP: complete]
Syntax
<check_declaration> ::= 'check' <expr>
<cut_declaration> ::= 'cut' <expr>
check_sat
This keyword is used just like goal
and check_valid
, but it describes a property that alt-ergo will
try to prove invalid. This keywork has been introduced in the version 2.5.0 as a part of the model
instanciation, and in this version alt-ergo
never returns SAT
, but unknown
instead.
Example
test.ae
logic x, y : int
check_sat g: x = y
$ alt-ergo test.ae --model
unknown
(model
; Functions
; Constants
(define-fun x () int 0)
(define-fun y () int 0)
; Arrays not yet supported
)
File "test.ae", line 3, characters 14-19: I don't know (0.0030) (2 steps) (goal g)