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

请求协助:基于SMT-LIB的汉诺塔问题建模与结果优化

汉诺塔谜题的SMT-LIB完整建模方案

原始代码的核心问题修正

  • 修复语法拼写错误:imples改为标准SMT-LIB关键字implies
  • 修正范围判断逻辑:将(1 <= discs numDisc)改为(and (<= 1 discs) (<= discs numDisc)),符合SMT-LIB的二元谓词语法
  • 补充缺失的关键约束:
    • 移动的圆盘必须是当前杆的最顶部圆盘(同一时间同一杆上无更小圆盘)
    • 移动后目标杆上不能有比当前圆盘更小的圆盘(保证小圆盘在上)
    • 每一步所有杆上的圆盘都严格遵循大圆盘在下、小圆盘在上的顺序

完整纯SMT-LIB代码

; 定义从初始到目标状态的总时间点(步数= N,因为从0到N共N+1个状态)
(declare-const N Int)

; 函数D(disc, step):返回第disc个圆盘在第step步所在的杆(杆编号0、1、2)
(declare-fun D (Int Int) Int)

; 圆盘总数
(declare-const numDisc Int)

(assert (and
    ; 设置圆盘数量为2(可修改为任意正整数)
    (= numDisc 2)

    ; 初始状态:所有圆盘都在杆0上
    (forall ((disc Int))
        (implies (and (<= 1 disc) (<= disc numDisc))
            (= (D disc 0) 0)
        )
    )

    ; 目标状态:所有圆盘都在杆2上
    (forall ((disc Int))
        (implies (and (<= 1 disc) (<= disc numDisc))
            (= (D disc N) 2)
        )
    )

    ; 每一步的移动规则:时间t到t+1仅移动一个圆盘,其余位置不变
    (forall ((t Int))
        (implies (and (>= t 0) (< t N))
            (exists ((disc Int) (rodFrom Int) (rodTo Int))
                (and
                    ; 圆盘编号合法
                    (and (<= 1 disc) (<= disc numDisc))
                    ; 起始杆、目标杆合法且不同
                    (and (<= 0 rodFrom) (<= rodFrom 2))
                    (and (<= 0 rodTo) (<= rodTo 2))
                    (distinct rodFrom rodTo)
                    ; 移动的圆盘在t时刻位于rodFrom,t+1时刻位于rodTo
                    (= (D disc t) rodFrom)
                    (= (D disc (+ t 1)) rodTo)
                    ; 其他圆盘位置保持不变
                    (forall ((otherDisc Int))
                        (implies (and (<= 1 otherDisc) (<= otherDisc numDisc) (not (= otherDisc disc)))
                            (= (D otherDisc t) (D otherDisc (+ t 1)))
                        )
                    )
                    ; 约束1:移动的圆盘是rodFrom的最顶部(无更小圆盘在同一杆)
                    (forall ((smallerDisc Int))
                        (implies (and (<= 1 smallerDisc) (< smallerDisc disc))
                            (not (= (D smallerDisc t) rodFrom))
                        )
                    )
                    ; 约束2:移动后,目标杆rodTo上无更小圆盘(保证小圆盘在上)
                    (forall ((smallerDisc Int))
                        (implies (and (<= 1 smallerDisc) (< smallerDisc disc))
                            (not (= (D smallerDisc (+ t 1)) rodTo))
                        )
                    )
                    ; 约束3:每一步所有杆上的圆盘顺序合法(大圆盘在下)
                    (forall ((r Int) (dBig Int) (dSmall Int))
                        (implies (and
                                    (<= 0 r) (<= r 2)
                                    (<= 1 dBig) (<= dBig numDisc)
                                    (<= 1 dSmall) (<= dSmall numDisc)
                                    (> dBig dSmall)
                                    (= (D dBig t) r)
                                    (= (D dSmall t) r)
                                )
                                ; 若大圆盘和小圆盘在同一杆,则所有中间尺寸的圆盘也必须在该杆(保证顺序)
                                (forall ((dMid Int))
                                    (implies (and (> dBig dMid) (> dMid dSmall))
                                        (= (D dMid t) r)
                                    )
                                )
                        )
                    )
                )
            )
        )
    )

    ; 强制求解最少步数(汉诺塔n盘最少需要2^n -1步)
    (= N (- (^ 2 numDisc) 1))
))

; 检查可满足性
(check-sat)

; 获取所有关键状态值:总步数N,每个圆盘在每一步的位置
(get-value (
    N
    (D 1 0) (D 1 1) (D 1 2) (D 1 3)
    (D 2 0) (D 2 1) (D 2 2) (D 2 3)
))

人类可读输出转换示例

运行代码后,z3会返回sat及如下结果(以2个圆盘为例):

((N 3)
 ((D 1 0) 0) ((D 1 1) 1) ((D 1 2) 1) ((D 1 3) 2)
 ((D 2 0) 0) ((D 2 1) 0) ((D 2 2) 2) ((D 2 3) 2))

转换为自然语言步骤:

  1. 初始状态(步0):圆盘1在杆0,圆盘2在杆0
  2. 步1:将圆盘1从杆0移到杆1,圆盘2留在杆0
  3. 步2:将圆盘2从杆0移到杆2,圆盘1留在杆1
  4. 步3(目标状态):将圆盘1从杆1移到杆2,所有圆盘到达杆2

扩展提示

  • 修改(= numDisc 2)可调整圆盘数量,同时更新get-value中的步数范围(覆盖0到N的所有状态)
  • 若不需要强制最少步数,可删除(= N (- (^ 2 numDisc) 1))约束,z3会返回任意可行解

内容的提问来源于stack exchange,提问作者Kaloyan Stoykov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:40:59