要求字符串的 Dafny 前提条件不仅是空格
Dafny precondition to require a string is not only whitespace
我正在尝试编写一个前提条件来要求字符串至少包含一个非空白字符。我写了以下内容:
predicate AllWhiteSpaceChars(s: string) {
forall i :: 0 <= i < |s| ==> s[i] in {' ', '\n', /*'\f',*/ '\r', '\t'/*, '\v'*/}
}
但是我无法让我的程序用它来验证。以下失败:
method test1(s: string)
requires !AllWhiteSpaceChars(s)
{
print s;
}
method test2()
{
test1("./foo");
}
我的谓词有什么问题,如何创建工作前提?
似乎是触发问题。以下作品。但也许更熟悉触发器的人可以提出更好的解决方案。
predicate HasNonWhiteSpace(s: string) {
if s == []
then false
else s[0] !in {' ', '\n', /*'\f',*/ '\r', '\t'/*, '\v'*/} || HasNonWhiteSpace(s[1..])
}
method test1(s: string)
requires HasNonWhiteSpace(s)
{
print s;
}
method test2()
{
test1("./foo");
test1("\t\n ");
test1("d d");
}
顺便说一句:不确定您是否打算要求打印的字符串为非空字符串。我当前的解决方案也需要这样做。
我正在尝试编写一个前提条件来要求字符串至少包含一个非空白字符。我写了以下内容:
predicate AllWhiteSpaceChars(s: string) {
forall i :: 0 <= i < |s| ==> s[i] in {' ', '\n', /*'\f',*/ '\r', '\t'/*, '\v'*/}
}
但是我无法让我的程序用它来验证。以下失败:
method test1(s: string)
requires !AllWhiteSpaceChars(s)
{
print s;
}
method test2()
{
test1("./foo");
}
我的谓词有什么问题,如何创建工作前提?
似乎是触发问题。以下作品。但也许更熟悉触发器的人可以提出更好的解决方案。
predicate HasNonWhiteSpace(s: string) {
if s == []
then false
else s[0] !in {' ', '\n', /*'\f',*/ '\r', '\t'/*, '\v'*/} || HasNonWhiteSpace(s[1..])
}
method test1(s: string)
requires HasNonWhiteSpace(s)
{
print s;
}
method test2()
{
test1("./foo");
test1("\t\n ");
test1("d d");
}
顺便说一句:不确定您是否打算要求打印的字符串为非空字符串。我当前的解决方案也需要这样做。