标签: hoare-logic

Hoare Partitioning算法讲解

根据许多网站中给出的伪代码,我编写了这个Hoare分区算法,它采用一个数组,根据给定的主元对子数组的开始和结束索引进行分区。它工作得很好,但是有人可以解释一下逻辑,它是如何做到这一点的吗?这是代码:

def hoare(arr,start,end):
     pivot = 4
     i,j = start,end
     while i < j:
        while i < j and arr[i] <= pivot:
            i += 1
        while j >= i and arr[j] > pivot:
            j -= 1
        if i < j:
            arr[i],arr[j] = arr[j],arr[i]
     return j    
Run Code Online (Sandbox Code Playgroud)

分区还有另一种变体,即Lomuto算法。Hoare它做了类似的事情,尽管由于我一开始就不理解该算法,所以我无法发现其中的区别。谁能解释一下算法中发生了什么,以及在哪种情况下哪种算法能提供更好的性能?

python partitioning hoare-logic

5
推荐指数
1
解决办法
7148
查看次数

用Python进行程序验证

我正在教一本关于FOL和程序验证的课程,该课程的灵感来自Morderhai Ben-Ari,《计算机科学的数学逻辑》,施普林格,1993-2012年。我想通过让学生使用Python进行编程来说明这些概念。

对于FOL,我使用的是NLTK,它具有出色的FOL软件包。

但是我还没有找到用于程序验证的Python包:插入前置条件和后置条件逻辑公式,查找循环不变式,逐步验证Python程序等。换句话说,要在Python内使用Hoare逻辑框架并为Python使用程式。

您是否知道此任务的任何包装?

python hoare-logic

5
推荐指数
1
解决办法
615
查看次数

如何使用hoare逻辑证明这个二进制搜索算法是正确的?

这是算法:

// Precondition: n > 0

l = -1;
r = n;

while (l+1 != r) {
    m = (l+r)/2;

    // I && m == (l+r)/2

    if (a[m] <= x) {
        l = m;
    } else {
        r = m;
    }
}
// Postcondition: -1 <= l < n
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,并将不变量缩小到了if x is in a[0 .. n-1] then a[l] <= x < a[r].

我不知道如何从那里进步.前提似乎过于宽泛,所以我很难显示出来P -> I.

非常感谢任何帮助.这些是可用于证明算法正确性的逻辑规则:

条件的逻辑规则

循环的逻辑规则

algorithm correctness binary-search hoare-logic proof-of-correctness

5
推荐指数
1
解决办法
605
查看次数

{true} x:= y {x = y}是有效的Hoare三联?

我不确定

{ true } x := y { x = y }
Run Code Online (Sandbox Code Playgroud)

是一个有效的Hoare三重奏.

我不确定是否允许引用变量(在这种情况下y),而不是先在三重程序体中或在前置条件中明确定义它.

{ y=1 } x := y { x = y } //valid

{true} y := 1; x := y { x = y } //valid
Run Code Online (Sandbox Code Playgroud)

如何?

logic hoare-logic

4
推荐指数
2
解决办法
904
查看次数

如何用frama -c wp中的计算证明迭代循环?

我有我的测试代码(研究WP循环不变量),它在数组单元格中添加两个长整数,每个数字的表示形式:

int main(int argc, const char * argv[]) {

char a[32], b[32];//size can be very big
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
scanf("%s %s", a, b);
unsigned int size1 = strlen(a);
unsigned int size2 = strlen(b);
//code to reverse a string. currently proved 
reverse(a, size1);
reverse(b, size2);
for (unsigned int i = 0; i < size1; i++) a[i]-='0'; //move from chars to integers
for (unsigned int j = 0; j < size2; j++) b[j]-='0';
unsigned int maxsize = size1;
if …
Run Code Online (Sandbox Code Playgroud)

c frama-c hoare-logic loop-invariant

1
推荐指数
1
解决办法
196
查看次数