如何证明在C和JavaScript中替换字符串中的字符是等效的?
-
29-09-2020 - |
题
我想尝试一些不同的证据,特别是在两种不同的编程语言中证明了某些功能的实现等价(C和JS在本问题中)。
这是关于证明替换字符串中的一个字符在c和js中等同。
在js中,例如,字符串是 immutable ,而在c中,字符串是变形 。所以在JS中,您可能需要这样做:
functioni replaceAt(string, index, replacement) {
return string.substr(0, index) + replacement + string.substr(index + replacement.length)
}
.
而在c中,您可能只是这样做:
#include<stdio.h>
int
main() {
char string[11] = "hello world";
string[1] = 'i';
printf("%s", string);
return 0;
}
.
基本上,我试图提出一个例子,其中感知效果或期望的结果是的所有意图和目的 <强大>同样的。也就是说,最终结果是在特定位置(每种语言中的相同位置)替换字符。即使在一种语言中,字符串是变形,而在另一个语言中,它是 Unmutable 。这里需要考虑到什么,以使证明说出这是相同的?我们如何捕捉“部分等价”或“感知等价”的概念? (通过我的意思,结果大致相同,因此我们希望举例说明这些规范与某些规范相同)。
解决方案
我将通过创建所需函数的正式定义,然后从而证明每个实现的正确性。
考虑以下公理定义:
$$ refoyeat:string * \ mathbb z * char \ to string $$
$$ \ forall c:char。 (\留下我\ In \ MathBB Z〜。〜redenteat(`,i,c)=``)$$
$$ \ forall c:char。 (\ forall s:string。(\ forall i \ in 0 .. len(s)-1〜。〜replyeat(s,i,c)[i]= c))$$
$$ \ forall c:char。 (\ forall s:string。(\ forall i \在0 .. len(s)-1〜。〜len(replyeat(s,i,c))= len(s)))$$ < / p>
$$ \ forall c:char。(\ forall s:string。(\ forall i,j \ In 0..len(s)-1。i \ neq j \意味着替换(s,i,c)[j]= s [j]))$$
$$ \ forall c:char。(\ forall s:string。(\ forall i \ in \ mathbb z。i \ geq len(s)\意味着replyeat(s ,i,c)= s))$$
如果您可以证明每个实施的正确性,我会说他们是等同的。目前,您的 C 实现甚至不是一个函数。您的 javascript 函数呈现一个字符串而不是char。它们都没有定义为大于输入的索引。
我不认为将实现的实现比较有意义,因为每种语言的实现模型都有很多差异。