Как доказать, что замена символа в строке как в C и JavaScript эквивалентна?
-
29-09-2020 - |
Вопрос
Я хотел бы попробовать некоторые различные доказательства, в частности, в доказательной эквивалентности реализации некоторой функции на двух разных языках программирования (C и JS в этом вопросе).
Это о дождевике того, что замена одного символа в строке эквивалентно в C и js.
в JS, например, Строки Immutable , в то время как в C, Строки Metable . Так что в 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;
}
.
в основном, я пытаюсь придумать пример, где, тот, который воспринимал эффект или желаемый результат для всех намерений и целей < сильный> такой же . То есть конечный результат заключается в том, что символ был заменен на определенное положение (одинаковое положение на каждом языке). Несмотря на то, что на одном языке строка была Metable , а в другом, это было неизменным . Что нужно учитывать здесь, чтобы сделать доказательство, говоря, что они эквивалентны? Как мы захватываем понятие «частичная эквивалентность» или «воспринимаемая эквивалентность»? (Под этим я имею в виду, результат - это примерно то же самое, поэтому мы хотим сделать подтверждение заявления о том, что они одинаковы в отношении некоторой спецификации).
Решение
Я бы начал с создания формального определения функции, которую вы хотите, а затем доказывая правильность каждой из реализаций.
Рассмотрим следующее аксиоматическое определение:
$$ Заменение: string * \ mathbb z * char \ to String $$
$$ \ forall C: char. (\ forall I \ in \ mathbb z ~. ~ Запретивное (`, i, c)=` `) $$
$$ \ forall C: char. (\ forall s: string. (\ forall i \ in 0 .. len (s) -1 ~. ~ Запретивные (s, i, c) [i]= c)) $$
$$ \ forall C: char. (\ forall s: string. (\ forall i \ in 0 .. len (s) -1 ~. ~ len (скрапезовать (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) \ подразумевает заменить , i, c)= s)) $$
Если вы можете доказать правильность каждой реализации к этим аксиомам, я бы сказал, что они эквивалентны. На данный момент ваша реализация C даже не является функцией. Ваша функция JavaScript имеет строку и не символ. Ни один из них не определен для индексов, превышающих ваш вход.
Я не думаю, что сравнивая реализацию в реализации имеет смысл, поскольку существует много различий в моделях реализации каждого языка.