我对伊德里斯(和依赖类型)非常陌生。我试图写一个程序来检查一个字符串是否是一个回文。为此,我决定计算字符串的长度,并计算
q,r = (strlen `div` 2, strlen `mod` 2)
然后按如下方式拆分字符串:
lhalf,rhalf = (substr 0 (q+r) str, substr (q-r) (q+r) str)
这将处理奇数和偶数长度的字符串。问题是Idris需要证明r < q因为q和r都是Nat。
我的问题是:我如何表达r的事实
以下是我的代码的完整示例:
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
答案 0 :(得分:2)
你不能证明r≤q是因为它不是真的。例如,给定字符串“a”,你有strlen = 1,因此q = 0,r = 1.在这个例子中,r≤q显然是假的。
请注意,您只需
即可实现isPalindromeisPalindrome: String -> Bool
isPalindrome str = str == reverse str