When working with the FloatingPoint SMT type (through the Silver AST), I encountered the following problem when I tried to verify a simple program:
; /field_value_functions_declarations.smt2 [Float__item: (_ FloatingPoint 8 24)]
(declare-fun $FVF.domain_Float__item ($FVF<(_ FloatingPoint 8 24)>) Set<$Ref>)
; (error "line 290 column 38: Parsing function declaration. Expecting sort list '(': unknown sort '$FVF<'")
I suspect that this is a sanitization issue in the part ($FVF<(_ FloatingPoint 8 24)>) because if I manually change this part to ($FVF<___FloatingPoint_8_24_>) and run Z3 again, Z3 tells me success instead of the error message.
Unfortunately since there is no syntax support for FloatingPoint types, I can't provide an example program where this happens, but I provided the full smt2 logfile in case that can help.
Full smt2 logfile
(get-info :version)
; (:version "4.8.6")
; Started: 2021-11-26 13:03:54
; Silicon.version: 1.1-SNAPSHOT (4dbb81fc@(detached))
; Input file: -
; Verifier id: 00
; ------------------------------------------------------------
; Begin preamble
; ////////// Static preamble
;
; ; /z3config.smt2
(set-option :print-success true) ; Boogie: false
(set-option :global-decls true) ; Boogie: default
(set-option :auto_config false) ; Usually a good idea
(set-option :smt.restart_strategy 0)
(set-option :smt.restart_factor |1.5|)
(set-option :smt.case_split 3)
(set-option :smt.delay_units true)
(set-option :smt.delay_units_threshold 16)
(set-option :nnf.sk_hack true)
(set-option :type_check true)
(set-option :smt.bv.reflect true)
(set-option :smt.mbqi false)
(set-option :smt.qi.eager_threshold 100)
(set-option :smt.qi.cost "(+ weight generation)")
(set-option :smt.qi.max_multi_patterns 1000)
(set-option :smt.phase_selection 0) ; default: 3, Boogie: 0
(set-option :sat.phase caching)
(set-option :sat.random_seed 0)
(set-option :nlsat.randomize true)
(set-option :nlsat.seed 0)
(set-option :nlsat.shuffle_vars false)
(set-option :fp.spacer.order_children 0) ; Not available with Z3 4.5
(set-option :fp.spacer.random_seed 0) ; Not available with Z3 4.5
(set-option :smt.arith.random_initial_value true) ; Boogie: true
(set-option :smt.random_seed 0)
(set-option :sls.random_offset true)
(set-option :sls.random_seed 0)
(set-option :sls.restart_init false)
(set-option :sls.walksat_ucb true)
(set-option :model.v2 true)
;
; ; /preamble.smt2
(declare-datatypes () ((
$Snap ($Snap.unit)
($Snap.combine ($Snap.first $Snap) ($Snap.second $Snap)))))
(declare-sort $Ref 0)
(declare-const $Ref.null $Ref)
(declare-sort $FPM)
(declare-sort $PPM)
(define-sort $Perm () Real)
(define-const $Perm.Write $Perm 1.0)
(define-const $Perm.No $Perm 0.0)
(define-fun $Perm.isValidVar ((p $Perm)) Bool
(<= $Perm.No p))
(define-fun $Perm.isReadVar ((p $Perm) (ub $Perm)) Bool
(and ($Perm.isValidVar p)
(not (= p $Perm.No))
(< p $Perm.Write)))
(define-fun $Perm.min ((p1 $Perm) (p2 $Perm)) Real
(ite (<= p1 p2) p1 p2))
(define-fun $Math.min ((a Int) (b Int)) Int
(ite (<= a b) a b))
(define-fun $Math.clip ((a Int)) Int
(ite (< a 0) 0 a))
; ////////// Sorts
(declare-sort Set<___FloatingPoint_8_24_>)
(declare-sort Set<$Ref>)
(declare-sort Set<$Snap>)
(declare-sort VCTArray<Ref>)
(declare-sort frac)
(declare-sort TYPE)
(declare-sort zfrac)
(declare-sort VCTOption<VCTArray<Ref>>)
(declare-sort $FVF<___FloatingPoint_8_24_>)
(declare-sort $FVF<$Ref>)
; ////////// Sort wrappers
; Declaring additional sort wrappers
(declare-fun $SortWrappers.IntTo$Snap (Int) $Snap)
(declare-fun $SortWrappers.$SnapToInt ($Snap) Int)
(assert (forall ((x Int)) (!
(= x ($SortWrappers.$SnapToInt($SortWrappers.IntTo$Snap x)))
:pattern (($SortWrappers.IntTo$Snap x))
:qid |$Snap.$SnapToIntTo$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.IntTo$Snap($SortWrappers.$SnapToInt x)))
:pattern (($SortWrappers.$SnapToInt x))
:qid |$Snap.IntTo$SnapToInt|
)))
(declare-fun $SortWrappers.BoolTo$Snap (Bool) $Snap)
(declare-fun $SortWrappers.$SnapToBool ($Snap) Bool)
(assert (forall ((x Bool)) (!
(= x ($SortWrappers.$SnapToBool($SortWrappers.BoolTo$Snap x)))
:pattern (($SortWrappers.BoolTo$Snap x))
:qid |$Snap.$SnapToBoolTo$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.BoolTo$Snap($SortWrappers.$SnapToBool x)))
:pattern (($SortWrappers.$SnapToBool x))
:qid |$Snap.BoolTo$SnapToBool|
)))
(declare-fun $SortWrappers.$RefTo$Snap ($Ref) $Snap)
(declare-fun $SortWrappers.$SnapTo$Ref ($Snap) $Ref)
(assert (forall ((x $Ref)) (!
(= x ($SortWrappers.$SnapTo$Ref($SortWrappers.$RefTo$Snap x)))
:pattern (($SortWrappers.$RefTo$Snap x))
:qid |$Snap.$SnapTo$RefTo$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.$RefTo$Snap($SortWrappers.$SnapTo$Ref x)))
:pattern (($SortWrappers.$SnapTo$Ref x))
:qid |$Snap.$RefTo$SnapTo$Ref|
)))
(declare-fun $SortWrappers.$PermTo$Snap ($Perm) $Snap)
(declare-fun $SortWrappers.$SnapTo$Perm ($Snap) $Perm)
(assert (forall ((x $Perm)) (!
(= x ($SortWrappers.$SnapTo$Perm($SortWrappers.$PermTo$Snap x)))
:pattern (($SortWrappers.$PermTo$Snap x))
:qid |$Snap.$SnapTo$PermTo$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.$PermTo$Snap($SortWrappers.$SnapTo$Perm x)))
:pattern (($SortWrappers.$SnapTo$Perm x))
:qid |$Snap.$PermTo$SnapTo$Perm|
)))
; Declaring additional sort wrappers
(declare-fun $SortWrappers.Set<___FloatingPoint_8_24_>To$Snap (Set<___FloatingPoint_8_24_>) $Snap)
(declare-fun $SortWrappers.$SnapToSet<___FloatingPoint_8_24_> ($Snap) Set<___FloatingPoint_8_24_>)
(assert (forall ((x Set<___FloatingPoint_8_24_>)) (!
(= x ($SortWrappers.$SnapToSet<___FloatingPoint_8_24_>($SortWrappers.Set<___FloatingPoint_8_24_>To$Snap x)))
:pattern (($SortWrappers.Set<___FloatingPoint_8_24_>To$Snap x))
:qid |$Snap.$SnapToSet<___FloatingPoint_8_24_>To$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.Set<___FloatingPoint_8_24_>To$Snap($SortWrappers.$SnapToSet<___FloatingPoint_8_24_> x)))
:pattern (($SortWrappers.$SnapToSet<___FloatingPoint_8_24_> x))
:qid |$Snap.Set<___FloatingPoint_8_24_>To$SnapToSet<___FloatingPoint_8_24_>|
)))
(declare-fun $SortWrappers.Set<$Ref>To$Snap (Set<$Ref>) $Snap)
(declare-fun $SortWrappers.$SnapToSet<$Ref> ($Snap) Set<$Ref>)
(assert (forall ((x Set<$Ref>)) (!
(= x ($SortWrappers.$SnapToSet<$Ref>($SortWrappers.Set<$Ref>To$Snap x)))
:pattern (($SortWrappers.Set<$Ref>To$Snap x))
:qid |$Snap.$SnapToSet<$Ref>To$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.Set<$Ref>To$Snap($SortWrappers.$SnapToSet<$Ref> x)))
:pattern (($SortWrappers.$SnapToSet<$Ref> x))
:qid |$Snap.Set<$Ref>To$SnapToSet<$Ref>|
)))
(declare-fun $SortWrappers.Set<$Snap>To$Snap (Set<$Snap>) $Snap)
(declare-fun $SortWrappers.$SnapToSet<$Snap> ($Snap) Set<$Snap>)
(assert (forall ((x Set<$Snap>)) (!
(= x ($SortWrappers.$SnapToSet<$Snap>($SortWrappers.Set<$Snap>To$Snap x)))
:pattern (($SortWrappers.Set<$Snap>To$Snap x))
:qid |$Snap.$SnapToSet<$Snap>To$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.Set<$Snap>To$Snap($SortWrappers.$SnapToSet<$Snap> x)))
:pattern (($SortWrappers.$SnapToSet<$Snap> x))
:qid |$Snap.Set<$Snap>To$SnapToSet<$Snap>|
)))
; Declaring additional sort wrappers
(declare-fun $SortWrappers.VCTArray<Ref>To$Snap (VCTArray<Ref>) $Snap)
(declare-fun $SortWrappers.$SnapToVCTArray<Ref> ($Snap) VCTArray<Ref>)
(assert (forall ((x VCTArray<Ref>)) (!
(= x ($SortWrappers.$SnapToVCTArray<Ref>($SortWrappers.VCTArray<Ref>To$Snap x)))
:pattern (($SortWrappers.VCTArray<Ref>To$Snap x))
:qid |$Snap.$SnapToVCTArray<Ref>To$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.VCTArray<Ref>To$Snap($SortWrappers.$SnapToVCTArray<Ref> x)))
:pattern (($SortWrappers.$SnapToVCTArray<Ref> x))
:qid |$Snap.VCTArray<Ref>To$SnapToVCTArray<Ref>|
)))
(declare-fun $SortWrappers.fracTo$Snap (frac) $Snap)
(declare-fun $SortWrappers.$SnapTofrac ($Snap) frac)
(assert (forall ((x frac)) (!
(= x ($SortWrappers.$SnapTofrac($SortWrappers.fracTo$Snap x)))
:pattern (($SortWrappers.fracTo$Snap x))
:qid |$Snap.$SnapTofracTo$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.fracTo$Snap($SortWrappers.$SnapTofrac x)))
:pattern (($SortWrappers.$SnapTofrac x))
:qid |$Snap.fracTo$SnapTofrac|
)))
(declare-fun $SortWrappers.TYPETo$Snap (TYPE) $Snap)
(declare-fun $SortWrappers.$SnapToTYPE ($Snap) TYPE)
(assert (forall ((x TYPE)) (!
(= x ($SortWrappers.$SnapToTYPE($SortWrappers.TYPETo$Snap x)))
:pattern (($SortWrappers.TYPETo$Snap x))
:qid |$Snap.$SnapToTYPETo$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.TYPETo$Snap($SortWrappers.$SnapToTYPE x)))
:pattern (($SortWrappers.$SnapToTYPE x))
:qid |$Snap.TYPETo$SnapToTYPE|
)))
(declare-fun $SortWrappers.zfracTo$Snap (zfrac) $Snap)
(declare-fun $SortWrappers.$SnapTozfrac ($Snap) zfrac)
(assert (forall ((x zfrac)) (!
(= x ($SortWrappers.$SnapTozfrac($SortWrappers.zfracTo$Snap x)))
:pattern (($SortWrappers.zfracTo$Snap x))
:qid |$Snap.$SnapTozfracTo$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.zfracTo$Snap($SortWrappers.$SnapTozfrac x)))
:pattern (($SortWrappers.$SnapTozfrac x))
:qid |$Snap.zfracTo$SnapTozfrac|
)))
(declare-fun $SortWrappers.VCTOption<VCTArray<Ref>>To$Snap (VCTOption<VCTArray<Ref>>) $Snap)
(declare-fun $SortWrappers.$SnapToVCTOption<VCTArray<Ref>> ($Snap) VCTOption<VCTArray<Ref>>)
(assert (forall ((x VCTOption<VCTArray<Ref>>)) (!
(= x ($SortWrappers.$SnapToVCTOption<VCTArray<Ref>>($SortWrappers.VCTOption<VCTArray<Ref>>To$Snap x)))
:pattern (($SortWrappers.VCTOption<VCTArray<Ref>>To$Snap x))
:qid |$Snap.$SnapToVCTOption<VCTArray<Ref>>To$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.VCTOption<VCTArray<Ref>>To$Snap($SortWrappers.$SnapToVCTOption<VCTArray<Ref>> x)))
:pattern (($SortWrappers.$SnapToVCTOption<VCTArray<Ref>> x))
:qid |$Snap.VCTOption<VCTArray<Ref>>To$SnapToVCTOption<VCTArray<Ref>>|
)))
; Declaring additional sort wrappers
(declare-fun $SortWrappers.$FVF<___FloatingPoint_8_24_>To$Snap ($FVF<___FloatingPoint_8_24_>) $Snap)
(declare-fun $SortWrappers.$SnapTo$FVF<___FloatingPoint_8_24_> ($Snap) $FVF<___FloatingPoint_8_24_>)
(assert (forall ((x $FVF<___FloatingPoint_8_24_>)) (!
(= x ($SortWrappers.$SnapTo$FVF<___FloatingPoint_8_24_>($SortWrappers.$FVF<___FloatingPoint_8_24_>To$Snap x)))
:pattern (($SortWrappers.$FVF<___FloatingPoint_8_24_>To$Snap x))
:qid |$Snap.$SnapTo$FVF<___FloatingPoint_8_24_>To$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.$FVF<___FloatingPoint_8_24_>To$Snap($SortWrappers.$SnapTo$FVF<___FloatingPoint_8_24_> x)))
:pattern (($SortWrappers.$SnapTo$FVF<___FloatingPoint_8_24_> x))
:qid |$Snap.$FVF<___FloatingPoint_8_24_>To$SnapTo$FVF<___FloatingPoint_8_24_>|
)))
(declare-fun $SortWrappers.$FVF<$Ref>To$Snap ($FVF<$Ref>) $Snap)
(declare-fun $SortWrappers.$SnapTo$FVF<$Ref> ($Snap) $FVF<$Ref>)
(assert (forall ((x $FVF<$Ref>)) (!
(= x ($SortWrappers.$SnapTo$FVF<$Ref>($SortWrappers.$FVF<$Ref>To$Snap x)))
:pattern (($SortWrappers.$FVF<$Ref>To$Snap x))
:qid |$Snap.$SnapTo$FVF<$Ref>To$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.$FVF<$Ref>To$Snap($SortWrappers.$SnapTo$FVF<$Ref> x)))
:pattern (($SortWrappers.$SnapTo$FVF<$Ref> x))
:qid |$Snap.$FVF<$Ref>To$SnapTo$FVF<$Ref>|
)))
; Declaring additional sort wrappers
(declare-fun $SortWrappers.___FloatingPoint_8_24_To$Snap ((_ FloatingPoint 8 24)) $Snap)
(declare-fun $SortWrappers.$SnapTo___FloatingPoint_8_24_ ($Snap) (_ FloatingPoint 8 24))
(assert (forall ((x (_ FloatingPoint 8 24))) (!
(= x ($SortWrappers.$SnapTo___FloatingPoint_8_24_($SortWrappers.___FloatingPoint_8_24_To$Snap x)))
:pattern (($SortWrappers.___FloatingPoint_8_24_To$Snap x))
:qid |$Snap.$SnapTo___FloatingPoint_8_24_To$Snap|
)))
(assert (forall ((x $Snap)) (!
(= x ($SortWrappers.___FloatingPoint_8_24_To$Snap($SortWrappers.$SnapTo___FloatingPoint_8_24_ x)))
:pattern (($SortWrappers.$SnapTo___FloatingPoint_8_24_ x))
:qid |$Snap.___FloatingPoint_8_24_To$SnapTo___FloatingPoint_8_24_|
)))
; ////////// Symbols
(declare-fun Set_in ((_ FloatingPoint 8 24) Set<___FloatingPoint_8_24_>) Bool)
(declare-fun Set_card (Set<___FloatingPoint_8_24_>) Int)
(declare-const Set_empty Set<___FloatingPoint_8_24_>)
(declare-fun Set_singleton ((_ FloatingPoint 8 24)) Set<___FloatingPoint_8_24_>)
(declare-fun Set_unionone (Set<___FloatingPoint_8_24_> (_ FloatingPoint 8 24)) Set<___FloatingPoint_8_24_>)
(declare-fun Set_union (Set<___FloatingPoint_8_24_> Set<___FloatingPoint_8_24_>) Set<___FloatingPoint_8_24_>)
(declare-fun Set_disjoint (Set<___FloatingPoint_8_24_> Set<___FloatingPoint_8_24_>) Bool)
(declare-fun Set_difference (Set<___FloatingPoint_8_24_> Set<___FloatingPoint_8_24_>) Set<___FloatingPoint_8_24_>)
(declare-fun Set_intersection (Set<___FloatingPoint_8_24_> Set<___FloatingPoint_8_24_>) Set<___FloatingPoint_8_24_>)
(declare-fun Set_subset (Set<___FloatingPoint_8_24_> Set<___FloatingPoint_8_24_>) Bool)
(declare-fun Set_equal (Set<___FloatingPoint_8_24_> Set<___FloatingPoint_8_24_>) Bool)
(declare-fun Set_in ($Ref Set<$Ref>) Bool)
(declare-fun Set_card (Set<$Ref>) Int)
(declare-const Set_empty Set<$Ref>)
(declare-fun Set_singleton ($Ref) Set<$Ref>)
(declare-fun Set_unionone (Set<$Ref> $Ref) Set<$Ref>)
(declare-fun Set_union (Set<$Ref> Set<$Ref>) Set<$Ref>)
(declare-fun Set_disjoint (Set<$Ref> Set<$Ref>) Bool)
(declare-fun Set_difference (Set<$Ref> Set<$Ref>) Set<$Ref>)
(declare-fun Set_intersection (Set<$Ref> Set<$Ref>) Set<$Ref>)
(declare-fun Set_subset (Set<$Ref> Set<$Ref>) Bool)
(declare-fun Set_equal (Set<$Ref> Set<$Ref>) Bool)
(declare-fun Set_in ($Snap Set<$Snap>) Bool)
(declare-fun Set_card (Set<$Snap>) Int)
(declare-const Set_empty Set<$Snap>)
(declare-fun Set_singleton ($Snap) Set<$Snap>)
(declare-fun Set_unionone (Set<$Snap> $Snap) Set<$Snap>)
(declare-fun Set_union (Set<$Snap> Set<$Snap>) Set<$Snap>)
(declare-fun Set_disjoint (Set<$Snap> Set<$Snap>) Bool)
(declare-fun Set_difference (Set<$Snap> Set<$Snap>) Set<$Snap>)
(declare-fun Set_intersection (Set<$Snap> Set<$Snap>) Set<$Snap>)
(declare-fun Set_subset (Set<$Snap> Set<$Snap>) Bool)
(declare-fun Set_equal (Set<$Snap> Set<$Snap>) Bool)
(declare-fun zfrac_val<Perm> (zfrac) $Perm)
(declare-const class_Ref<TYPE> TYPE)
(declare-const class_java_DOT_lang_DOT_Object<TYPE> TYPE)
(declare-const class_EncodedGlobalVariables<TYPE> TYPE)
(declare-fun directSuperclass<TYPE> (TYPE) TYPE)
(declare-fun type_of<TYPE> ($Ref) TYPE)
(declare-const VCTNone<VCTOption<VCTArray<Ref>>> VCTOption<VCTArray<Ref>>)
(declare-fun VCTSome<VCTOption<VCTArray<Ref>>> (VCTArray<Ref>) VCTOption<VCTArray<Ref>>)
(declare-fun getVCTOption<VCTArray<Ref>> (VCTOption<VCTArray<Ref>>) VCTArray<Ref>)
(declare-fun loc<Ref> (VCTArray<Ref> Int) $Ref)
(declare-fun alen<Int> (VCTArray<Ref>) Int)
(declare-fun second<Int> ($Ref) Int)
(declare-fun frac_val<Perm> (frac) $Perm)
; /field_value_functions_declarations.smt2 [Float__item: (_ FloatingPoint 8 24)]
(declare-fun $FVF.domain_Float__item ($FVF<___FloatingPoint_8_24_>) Set<$Ref>)
; (error "line 290 column 38: Parsing function declaration. Expecting sort list '(': unknown sort '$FVF<'")
When working with the FloatingPoint SMT type (through the Silver AST), I encountered the following problem when I tried to verify a simple program:
I suspect that this is a sanitization issue in the part
($FVF<(_ FloatingPoint 8 24)>)because if I manually change this part to($FVF<___FloatingPoint_8_24_>)and run Z3 again, Z3 tells me success instead of the error message.Unfortunately since there is no syntax support for FloatingPoint types, I can't provide an example program where this happens, but I provided the full smt2 logfile in case that can help.
Full smt2 logfile