首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个SBV代码在达到我设定的极限之前就停止了?

为什么这个SBV代码在达到我设定的极限之前就停止了?
EN

Stack Overflow用户
提问于 2015-12-08 18:01:15
回答 1查看 119关注 0票数 4

我有这个定理(不确定这是不是正确的词),我想得到所有的解。

代码语言:javascript
复制
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的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-08 21:54:41

给出一个完整的程序总是很好的:

代码语言:javascript
复制
{-# 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)

当我运行它时,我得到:

代码语言:javascript
复制
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

注意最后的Unknown.

从本质上讲,SBV询问了Z3,得到了6种解决方案;当SBV询问7号时,Z3说:“我不知道是否还有其他解决方案。”用非线性算法,这种行为是可以预料的。

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

代码语言:javascript
复制
constrain $ m .== limit

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

代码语言:javascript
复制
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生产了:

代码语言:javascript
复制
(576,13824,-120)

因此,显然,基于allSat的方法导致Z3放弃的时间比修复m和迭代我们自己的实际效果要早得多。对于一个非线性问题,期望任何更快/更好的东西对于一般的SMT求解者来说都是太高的要求了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34162834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档