我想尝试一些不同的证据,特别是在两种不同的编程语言中证明了某些功能的实现等价(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。它们都没有定义为大于输入的索引。

我不认为将实现的实现比较有意义,因为每种语言的实现模型都有很多差异。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top