Как доказать, что замена символа в строке как в C и JavaScript эквивалентна?

cs.stackexchange https://cs.stackexchange.com/questions/126594

Вопрос

Я хотел бы попробовать некоторые различные доказательства, в частности, в доказательной эквивалентности реализации некоторой функции на двух разных языках программирования (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 имеет строку и не символ. Ни один из них не определен для индексов, превышающих ваш вход.

Я не думаю, что сравнивая реализацию в реализации имеет смысл, поскольку существует много различий в моделях реализации каждого языка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top