Come dimostrare che la sostituzione di un personaggio in una stringa in entrambi c e JavaScript è equivalente?

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

Domanda

Vorrei provare alcune prove diverse, in particolare nel dimostrare l'equivalenza dell'attuazione di alcune funzionalità in due diversi linguaggi di programmazione (C e JS in questa domanda).

Si tratta di dimostrare che Sostituzione di un carattere in una stringa equivale in C e JS

in JS, ad esempio, stringhe sono immutabili , mentre in c, stringhe sono mutable . Quindi in JS potresti farlo:

functioni replaceAt(string, index, replacement) {
  return string.substr(0, index) + replacement + string.substr(index + replacement.length)
}
.

Mentre è in c potresti semplicemente fare qualcosa del genere:

#include<stdio.h>

int
main() {
  char string[11] = "hello world";
  string[1] = 'i';
  printf("%s", string);
  return 0;
}
.

Fondamentalmente, sto cercando di inventare un esempio in cui, il Effetto percepito o risultato desiderato è per tutti gli effetti e gli scopi < forte> lo stesso . Cioè, il risultato finale è che il carattere è stato sostituito in una posizione specifica (la stessa posizione in ogni lingua). Anche se in una lingua la stringa era mutabile , mentre nell'altro è stato immutabile . Ciò che deve essere preso in considerazione qui per fare una prova dicendo che questi sono equivalenti? Come catturaremo la nozione di "parziale equivalenza" o "equivalenza percepita"? (Con questo voglio dire, il risultato è all'incirca lo stesso, quindi vogliamo fare una dichiarazione di prova che questi sono gli stessi per quanto riguarda alcune specifiche).

È stato utile?

Soluzione

Inizierei creando una definizione formale della funzione che desideri e dimostrando la correttezza ciascuna delle implementazioni.

Considera la seguente definizione assiomatica:

$$ Sostituzione: stringa * \ mathbb z * char \ to string $$

$$ \ forall c: char. (\ Forall I \ in \ MathBB Z ~. ~ Sostituzione (``, i, c)= ``) $$

$$ \ forall c: char. (\ Forall s: stringa. (\ forall I \ in 0 .. len (s) -1 ~. ~ Sostituzione (s, i, c) [i]= c)) $$

$$ \ forall c: char. (\ Forall s: stringa. (\ Forll I \ in 0 .. len (s) -1 ~. ~ Len (Sostituzione (S, I, C))= Len (s))) $$ < / P >.

$$ \ forall c: char. (\ forall s: stringa. (\ forall I, j \ in 0..len (s) -1. I \ neq j \ implica sostituzione (s, i, c) [j]= s [j]))) $$

$$ \ forall c: char. (\ forall s: stringa. (\ forall I \ in \ mathbbb z. I \ geq len (s) \ implica sostituzione (s , i, c)= s)) $$

Se è possibile dimostrare la correttezza di ogni implementazione a questi assiomi direi che sono equivalenti. Al momento la tua attuazione c non è nemmeno una funzione. La funzione JavaScript prende una stringa e non un char. Nessuno di questi è definito per gli indici superiori al tuo ingresso.

Non ritengo che il confronto dell'attuazione all'attuazione abbia senso in quanto ci sono molte differenze nei modelli di implementazione di ciascuna lingua.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top