This release of Ethos is associated with the 1.3.0 release of the SMT solver cvc5.
-
Drops support for
:var
,:implicit
,:requires
and:opaque
as term attributes. The recommended way of introducing function symbols with named arguments is via the commanddeclare-parameterized-const
, which now permits the latter three as parameter annotations. The parameters of a parameterized constants are no longer assumed to be implicit, and are explicit by default. -
Change the execution semantics when a program takes an unevalated term as an argument. In particular, we do not call user provided programs and oracles when at least argument could not be evaluated. This change was made to make errors more intuitive. Note this changes the semantics of programs that previously relied on being called on unevaluated terms.
-
Change the semantics of a corner case of
eo::is_eq
. In particular,eo::is_eq
now returns false if given two syntactically equivalent terms whose evaluation is stuck. This change also impacts the semantics ofeo::requires
, which evaluates to the third argument if and only if the first two arguments are syntactically equivalent and are fully evaluated. -
User programs, user oracles, and builtin operators that are unapplied are now considered unevaluated. This makes the type checker more strict and disallows passing them as arguments to other programs, which previously led to undefined behavior.
-
In type checking, the free parameters in the types of parameters are now also bound when that parameter is instantiated.
-
Changed the semantics of pairwise and chainable operators for a single argument, which now reduces to the neutral element of the combining operator instead of a parse error.
-
The operator
eo::typeof
now fails to evaluate if the type of the given term is not ground. -
Adds support for the SMT-LIB
as
annotations for ambiguous functions and constants, i.e. those whose return type cannot be inferred from their argument types. Following SMT-LIB convention, ambiguous functions and constants are expected to be annotated with their return type using as. Eunoia translates this into a type argument to the function. This policy is applied both for ambiguous datatype constructors and ambiguous functions and constants declared withdeclare-parameterized-const
. -
The semantics for
eo::dt_constructors
is extended for instantiated parametric datatypes. For example callingeo::dt_constructors
on(List Int)
returns the list containingcons
and(as nil (List Int))
. -
The semantics for
eo::dt_selectors
is extended for annotated constructors. For example callingeo::dt_selectors
on(as nil (List Int))
returns the empty list. -
To support parameteric nil terminators, the operator
eo::nil
now always requires two arguments, the list operator and the desired type for the nil terminator. -
Adds support for dependent types for programs. The argument types of programs can now use
eo::quote
to specify an input parameter to that program. -
Adds builtin operators
eo::eq
andeo::is_ok
. -
Adds builtin list operators
eo::list_rev
,eo::list_erase
,eo::list_erase_all
,eo::list_setof
(returns the unique elements of the list),eo::list_minclude
(multiset inclusion) andeo::list_meq
(multiset equality). -
Added the option
--stats-all
to track the number of times side conditions are invoked. -
The option
--print-let
has been renamed to--print-dag
and is now enabled by default. The printer is changed to useeo::define
instead oflet
. -
The option
--binder-fresh
, which specified for fresh variables to be constructed when parsing binders, has been removed. -
Programs and oracles now are explicitly required to have at least one argument.
-
Remove support for the explicit parameter annotation
eo::_
, which was used to provide annotations for implicit arguments to parameterized constants. -
Programs are now recommended to use the attribute
:signature
to specify the argument and return types.