gpt4 book ai didi

haskell - 为什么此 SBV 代码在达到我设置的限制之前停止?

转载 作者:行者123 更新时间:2023-12-02 17:19:21 25 4
gpt4 key购买 nike

我有这个定理(不确定这个词是否正确),并且我想得到所有的解决方案。

pairCube limit = do
m <- natural exists "m"
n <- natural exists "n"
a <- natural exists "a"
constrain $ m^3 .== n^2
constrain $ m .< limit
return $ m + n .== a^2

res <- allSat (pairCube 1000)

-- Run from ghci
extractModels res :: [[Integer]]

这是试图解决问题:

存在无限对整数 (m, n),使得 m^3 = n^2 并且 m + n 是完全平方数。最大 m 小于 1000 的对是什么?

我知道实际的答案,只是通过暴力破解,但我想用 SBV 来做。

但是,当我运行代码时,它仅给出以下值(采用 [m, n, a] 形式):[[9,27,6],[64,512,24],[]]

但是,还有其他几个 m 值小于 1000 的解决方案未包括在内。

最佳答案

提供完整的程序总是好的:

{-# LANGUAGE ScopedTypeVariables #-}

import Data.SBV

pairCube :: SInteger -> Symbolic SBool
pairCube limit = do
(m :: SInteger) <- exists "m"
(n :: SInteger) <- exists "n"
(a :: SInteger) <- exists "a"
constrain $ m^(3::Integer) .== n^(2::Integer)
constrain $ m .< limit
return $ m + n .== a^(2::Integer)

main :: IO ()
main = print =<< allSat (pairCube 1000)

当我运行它时,我得到:

Main> main
Solution #1:
m = 0 :: Integer
n = 0 :: Integer
a = 0 :: Integer
Solution #2:
m = 9 :: Integer
n = 27 :: Integer
a = -6 :: Integer
Solution #3:
m = 1 :: Integer
n = -1 :: Integer
a = 0 :: Integer
Solution #4:
m = 9 :: Integer
n = 27 :: Integer
a = 6 :: Integer
Solution #5:
m = 64 :: Integer
n = 512 :: Integer
a = -24 :: Integer
Solution #6:
m = 64 :: Integer
n = 512 :: Integer
a = 24 :: Integer
Unknown

注意最后的未知。

本质上,SBV查询了Z3,得到了6个解;当SBV要求7号时,Z3说“我不知道是否还有其他解决方案”。对于非线性算术,这种行为是预期的。

为了回答原来的问题(即找到最大m),我将约束更改为:

constrain $ m .== limit

并将其与以下“驱动程序:”结合起来

main :: IO ()
main = loop 1000
where loop (-1) = putStrLn "Can't find the largest m!"
loop m = do putStrLn $ "Trying: " ++ show m
mbModel <- extractModel `fmap` sat (pairCube m)
case mbModel of
Nothing -> loop (m-1)
Just r -> print (r :: (Integer, Integer, Integer))

在我的机器上运行大约 50 分钟后,Z3 产生:

(576,13824,-120)

因此,显然基于 allSat 的方法导致 Z3 放弃的时间比我们修复 m 并迭代自己实际实现的目标要早得多。对于非线性问题,对于通用 SMT 求解器来说,期望任何更快/更好的结果都太过分了。

关于haskell - 为什么此 SBV 代码在达到我设置的限制之前停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34162834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com