首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Idris证明小于

Idris证明小于
EN

Stack Overflow用户
提问于 2017-10-01 06:06:45
回答 1查看 178关注 0票数 0

我对Idris (和依赖类型)非常陌生。我试着写一个程序来检查一个字符串是否是非回文。为此,我决定计算字符串的长度,并计算

代码语言:javascript
复制
q,r = (strlen `div` 2, strlen `mod` 2)

然后按如下方式拆分字符串:

代码语言:javascript
复制
lhalf,rhalf = (substr 0 (q+r) str, substr (q-r) (q+r) str)

这可以同时处理奇数和偶数长度的字符串。问题是Idris需要证明r

我的问题是:我如何表达r的事实?

下面是我的代码的完整示例:

代码语言:javascript
复制
module Main

isPalindrome : (str : String) -> String
isPalindrome str =
  let split = half_half str
  in show ((fst split) == reverse (snd split))
  where
    strlen : Nat
    strlen = length str

    divMod : Nat -> Nat -> (Nat,Nat)
    divMod x y = (x `div` y, x `mod` y)

    half_half : String -> (String, String)
    half_half "" = ("","")
    half_half x  = let
                     (q,r) = divMod strlen 2
                   in
                     (substr 0     (q+r) x,
                      substr (q-r) (q+r) x)

main : IO ()
main = repl "> " isPalindrome
EN

回答 1

Stack Overflow用户

发布于 2017-10-01 09:14:35

你不能证明r,≤,q,因为它不是真的。例如,给定字符串"a“,你有strlen = 1,因此q=0,r=1。在这个例子中,r≤q显然是假的。

注意,您可以简单地通过以下方式实现isPalindrome

代码语言:javascript
复制
isPalindrome: String -> Bool
isPalindrome str = str == reverse str
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46507456

复制
相关文章

相似问题

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