質問

私はいくつかの異なる証明を試して、特に2つの異なるプログラミング言語(この質問のCとJS)でいくつかの機能の実装の等価性を証明したいと思います。

これは、文字列内の1文字を置き換えることを証明することです。はCとJSに等価です。

たとえば、文字列は、C、不変 です。 href="https://www.tutorialride.com/c-strings-prograialride-ja-a-character-in-string-c-program.htm" rel="nofollow noreferrer">文字列は "em>" "です。 em> 。そのため、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;
}
.

基本的に、私は認識された効果または望ましい結果はすべての目的と目的のためのである。強い>同じ。すなわち、終了結果は、文字が特定の位置(各言語の同じ位置)で置き換えられたことです。一言語でも、弦は可変であったが、他方は不変であった。これらはこれらの証拠を言うためにここで考慮に入れる必要があるのでしょうか。 「部分的な等価」または「知覚される等価」の概念をどのように捉えるのですか? (私が意味すると、結果はほぼ同じであるので、これらがある仕様に関してこれらが同じであるという証明書を作りたいと思います。

役に立ちましたか?

解決

私はあなたが望む関数の正式な定義を作成し、それぞれの実装の正確性を証明します。

次の公理定義を考慮してください。

$$ replaceat:string * \ mathbb z * char \ to string $$

$$ \ forall c:char。 (\ forAll i \ \ mathbb z~。〜replaceat( ``、i、c)= `` ``)$$

$$ \ forall c:char。 (\ forall s:string。(\ forall i \ in 0.〜replaceat(s、i、c)[i]= c)))$$

$$ \ forall c:char。 (\ forall s:文字列。(\ forall i \ in 0.1 ~1~1 ~1 ~1 ~1~1〜Len(replaceat(s、i、c))= Len(s)))$$ < / P>

$$ \ forall c:char。(\ forall s:string。(\ forall i、j \ in 0.len - 1)。 \はreplaceat(s、i、c)[j]= s [j]))$$

$$ \ forall c:char。(\ forall s:string。(\ forall i \ in \ mathbb z。i \ Geq Len)。 、i、c)= S))$$

あなたがこれらの公理の各実装の正当性を証明することができるならば、私は彼らが同等であると言っています。現時点では、 c 実装は関数さえありません。 javascript 関数は文字列を取り、charではなくなります。入力よりも大きいインデックスに対してそれらのどれも定義されていません。

各言語の実装モデルには、実装に実装を比較するとは思わない。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top