假设我们有一个包含两个变量x和y的多线程程序,它必须具有以下关系:x == y(过度简化,但你明白了。)
predicate x == y通常应该为真(如果程序没有被破坏,应该如此);更改x或y的函数可以被视为处理向量(数学意义上的向量)(x,y)的运算符,其中此谓词是不变的。因此,正确的程序将初始化x和y,使得x == y,然后仅提供该谓词不变的操作。这意味着只要没有线程在这样的运算符内,谓词就是真的。操作符本身,为了正确操作,可能需要依赖谓词作为前置条件,因此在大多数情况下,它可能会将所有这些操作符转换为关键区域(一次只允许一个线程)对x和y进行操作,暂时违反谓词必须为真的规则。
我的问题是,专业编码员称这样的谓词是什么?
请注意,它不是“谓词”,它只是一个布尔表达式,可能是真或假,甚至一直在true和false之间变化。它不是“assertion”,因为它在维基百科上被描述为一个声明,即谓词在代码中的那一点(发现语句的那一点)总是为真。
它可能是invariant,只是查看维基百科上的描述,但不变量的数学含义是一个属性,当应用某种类型的操作时,该属性保持不变,似乎没有太清楚我希望他们只是永远是真的吗?我曾经听过的另一个词是“前提”,但我在互联网上找不到与上述相关的这个词(尽管this question似乎以这种方式使用它)。
答案 0 :(得分:0)
可以说程序范围的不变与更有限范围的不变量相反,例如循环不变量或类不变量。程序不变量将指示在整个程序的整个生命周期中哪个是真的,而循环不变量将指示在特定循环内的真实性。
专业程序员可能没有这个概念的精确术语,因为通常不可能在主流语言中提供程序不变量,因为他们缺乏即使只是指定这样一个要求的开箱即用设施,更不用说将其证明为程序范围的不变量。另一方面,每次我们成功运行编译器时,我们都会建立程序不变量。这种不变量的一个例子是"函数foo只接受一个字符串参数"。
有些语言具有完全开发的规范和证明机制,例如Coq,因此可能值得研究其术语。例如,Coq有关键词,如公理,假设,猜想,定理,引理等。
逻辑学家在“所有世界”中都提到了一个真实的陈述。作为逻辑真理。