You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Spacer/Z3的HORN逻辑中使用数组及Horn查询中使用UIF的问题

Horn查询中未解释函数(UIF)的使用及代码修复

核心问题解答

Horn查询可以直接使用未解释函数(UIF),你提供的代码无法运行的原因是:标准HORN逻辑不包含数组理论,而你声明了数组类型foo,这超出了该逻辑片段的默认支持范围。

修复方案

有两种可行的修复方式:

方式1:用未解释函数替代数组

将数组foo替换为未解释函数,完全贴合HORN逻辑的要求。修改后的代码如下:

(set-logic HORN)

(declare-fun k1 (Int) Bool)

; 用未解释函数替代数组
(declare-fun foo (Int) Int)

(assert (forall ((v Int)) (=> (< 666 (foo v)) (k1 v))))

(assert (forall ((v Int)) (=> (k1 v) (< 0 (foo v)))))

(check-sat)
(get-model)

这段代码可正常运行,求解器会返回sat并输出对应的模型。

方式2:启用求解器的HORN+Arrays扩展支持

部分求解器(如Z3)支持扩展的HORN逻辑,允许结合数组理论。你可以保留原代码,通过添加求解器选项适配:

(set-logic HORN)
; 启用数组支持的扩展选项
(set-option :horn.array.extensional true)
(set-option :smt.mbqi true)

(declare-fun k1 (Int) Bool)

(declare-const foo (Array Int Int))

(assert (forall ((v Int)) (=> (< 666 (select foo v)) (k1 v))))

(assert (forall ((v Int)) (=> (k1 v) (< 0 (select foo v)))))

(check-sat)
(get-model)

这种方式依赖求解器的扩展能力,兼容性不如方式1广泛。

补充说明

Horn逻辑的核心是带全称量词的蕴涵式(Horn子句),未解释函数是其原生支持的基础元素。数组属于一阶理论扩展,不在标准HORN逻辑的默认支持范围内,因此需要通过上述方式适配。

内容的提问来源于stack exchange,提问作者Ranjit Jhala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:12:07