Você pode escrever uma especificação inequívoca em um idioma natural como o inglês?

10

Parece-me que você não pode escrever uma especificação de software em inglês completamente livre de ambiguidades, simplesmente devido à natureza informal da linguagem natural - e, portanto, que uma especificação verdadeiramente inequívoca deve incluir código escrito em uma linguagem formalmente especificada.

Esse é um resultado conhecido ou estou faltando alguma coisa?

jl6
fonte
11
"código escrito em um idioma formalmente especificado". Isso seria matemática e lógica, certo? Não é para isso que servem a matemática e a lógica? Parece estranho perguntar, uma vez que essas línguas sempre existiram com o propósito expresso de serem inequívocas. Porque perguntar?
S.Lott
@ S.Lott: Os usuários desejam especificações em seu próprio idioma, não em matemática ou lógica formal. É nosso trabalho traduzir entre os dois domínios.
tdammers 9/09/11
2
Seu código pode ser inequívoco, mas isso não significa que esteja correto.
JeffO 9/09/11
11
@tdammers: O que? A pergunta era sobre linguagem natural versus linguagem formal. O que os usuários têm a ver com isso? Além disso, e se o usuário realmente for um lógico? Além disso, os "analistas de negócios" geralmente não escrevem em nome dos usuários? A coisa "usuário" parece ilusória e está fora dessa questão.
S.Lott 9/09/11
@ S.Lott: Eu estava assumindo uma situação em que você precisa descrever o software para um cliente / usuário / outra parte interessada não técnica, que seria o melhor motivo para querer usar uma linguagem natural em primeiro lugar.
tdammers 9/09/11

Respostas:

9

Não é isso que os advogados sempre faziam para evitar ambiguidades?

O resultado é que eles escrevem da maneira mais antinatural, tentando ler seus artigos é mais difícil do que nunca e, apesar disso, sempre existem inconsistências e ambiguidades.

Você está certo, não pode escrever uma especificação de software totalmente livre de ambiguidades, mas também não conseguirá implementar uma linguagem formal especificada.

É também por isso que documentamos nosso código, porque às vezes é difícil ler para nossas mentes.

Não faz sentido documentar código com outro código.

Jose Faeti
fonte
2
Alguns advogados gostam de ofuscar e obscurecer as coisas. Depende do seu objetivo.
Duffymo 08/09/11
11
Você está confundindo advogados com matemáticos.
Doc Brown
11
@ Doc: A matemática é apenas mais um código, porque somente matemáticos podem lê-lo, e não faz sentido documentar código com código, isso é criptografia.
Jose Faeti 9/09/11
2
@ Jose: Eu diria que você é muito simplista. 99% de todas as provas matemáticas são escritas em linguagem natural - é claro, uma linguagem técnica com termos especiais e mais ou menos utilizando fórmulas, mas certamente nenhuma "linguagem formalmente especificada".
Doc Brown
@ Doc: é o que estou dizendo ... documentos escritos em linguagem natural. Não faz sentido explicar um código com outro código.
Jose Faeti 9/09/11
4

Impossível? Vamos perguntar se é desejável primeiro. Se concordarmos que é impossível, e ainda houver muitos softwares úteis por aí, o objetivo de uma especificação inequívoca parecerá acadêmico.

Eu diria que é impossível provar que algo é perfeito e inequívoco, tanto para as especificações quanto para o software.

Eu acho que depende do tamanho do problema. Se o problema for pequeno o suficiente, de natureza matemática e talvez alguns outros critérios que eu estou perdendo, eu diria que é possível escrever uma especificação que seja viável.

Quanto maior o problema, maior a audiência, mais difícil é fazer.

Porém, aviônicos e outros problemas complexos sugerem que é possível escrever especificações "boas o suficiente" em inglês para resolver grandes problemas.

duffymo
fonte
2
"bom o suficiente é bom o suficiente, mas a perfeição é uma PITA" - eu costumava trabalhar na construção de controles de ambiente, e não existe uma especificação completamente inequívoca lá, mesmo quando elas correm para 400 páginas - às vezes isso não importava , e para as vezes em que tivemos RFIs
HorusKol 08/09/11
4

bem .. uma especificação completamente inequívoca do problema é o próprio código real :)

Esse é um problema conhecido e, para sistemas especiais de missão crítica, é obrigatório escrever uma especificação inequívoca em uma linguagem formal (programação) e depois transformá-la em um código que provavelmente faz o que a especificação diz. Este é um campo muito restrito, 99,999% dos desenvolvedores nunca precisam executar tarefas como essa, mas uma vez conversei com um cara que fazia isso para um sistema de controle de tráfego / ferrovia.

Karoly Horvath
fonte
3

Sou seguidor do W3C e costumo escrever artigos com base em suas especificações. Minha experiência me diz que ler qualquer especificação sem códigos de exemplo escritos é simplesmente uma dor de cabeça.

Concordo plenamente e acho que o principal motivo é que os desenvolvedores tendem a ler e entender melhor o código. Imagine que você obtenha um artigo matemático sem nenhuma fórmula.

To calculate the result, simply add variable x to variable y, 
and then divide that by the b factor.

ou:

result = (x + y) / b

Qual é o mais curto? Qual é mais legível? O que traz mais compreensão com isso?

O mesmo vale para as especificações. Muitas vezes, quando você chega às partes técnicas, escrever uma linha de código pode esclarecer um longo parágrafo de explicação.

Saeed Neamati
fonte
E mesmo assim, perguntarei quais são os domínios de (x + y) e (x + y) / b. Eles são duplos? Eles são inteiros? Eles são inteiros de comprimento infinito? Espero que, se eles são inteiros, você escreveu as regras sobre arredondamento :-)
Xanatos
1

Suponha que exista uma linguagem formal que permita escrever especificações não ambíguas. Então, proponho que deveria haver um mapeamento bijetivo para um subconjunto de inglês. Portanto, deve ser possível escrever especificações inequívocas se você se ater a esse subconjunto.

Mas qualquer linguagem formal que seja expressiva o suficiente para fazer algo interessante não estará livre de inconsistências (incompletude de Gödel).


fonte
Tenho certeza de que o raciocínio é ambíguo, pois está em inglês simples. Você poderia escrever em uma linguagem formal?
blubb
11
Eu acredito que esta é a sua suposição: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.88.1151
Thomas Owens
E, em seguida, há o problema da paragem, o que traduz a ambiguidade: N é maior do que N por um não define N
mojubá
11
-1 por ter errado o Teorema de Gödels.
Ingo
1

As especificações são ambíguas e imprecisas porque as pessoas são ambíguas e imprecisas. Encontre uma pessoa perfeita e talvez possa obter uma especificação perfeita.

Inglês, suaíli, sânscrito ou babilônico não faz diferença.

Dave Nay
fonte
1

A ambiguidade é realmente uma força neste contexto.

Para explicar o porquê, vamos supor por um momento que é possível usar o idioma inglês de uma maneira totalmente inequívoca, para que qualquer problema que possa ser resolvido programaticamente possa ser expresso de maneira completa e inequívoca. Se usarmos essa variante do inglês, e nossa descrição descrever de fato o programa a ser escrito completa e inequivocamente, segue-se logicamente que deve ser possível executar uma tradução automática para a linguagem de programação de destino - em outras palavras, a variante de O inglês que concebemos é na verdade uma linguagem de programação.

As pessoas que lêem documentos de design (especialmente designs funcionais) não desejam esse nível de detalhe - ler a fonte de um programa, seja em C ++, Java ou inglês inequívoco, está muito acima da cabeça dos não programadores. É aí que entram as linguagens naturais: elas permitem que o escritor de uma especificação deslize de qualquer maneira na escala de detalhes, movendo detalhes de implementação irrelevantes para o subtexto ou deixando-os totalmente não especificados. Os idiomas naturais estão cheios de dispositivos para transmitir significado de forma relativamente clara, mesmo que você não esteja fornecendo uma definição exata (que faz parte do que torna as traduções automatizadas tão difíceis).

Portanto, o objetivo geralmente não é uma especificação completa, correta e inequívoca; o objetivo é escrever uma especificação que ilustra claramente, para os seres humanos, o que você está prestes a construir.

Sempre que você precisa de um correto e inequívoco, e as coisas estão ficando técnicas de qualquer maneira, o pseudocódigo geralmente é mais valioso do que linguagens naturais ou formais rígidas - ele ainda pode deixar de fora detalhes irrelevantes (chamando funções / processos não especificados), mas a estrutura é inequívoca .

tdammers
fonte
0

Você não está perdendo nada, exceto que a documentação foi escrita para os humanos lerem. Alguma ambiguidade é esperada, e até bem-vinda, porque o texto conciso é difícil de ler (= não para humanos).

Especificar a documentação para uma linguagem formal em outra linguagem formal seria uma espécie de problema de galinha e ovo.

Se você realmente precisa de especificação formal, existem maneiras formais de verificar os modelos . É uma área de pesquisa ativa e muito interessante, mas os "usuários" finais aqui são máquinas, não humanos.

Radim
fonte
0

(Alguns dos meus argumentos já foram mencionados por outras respostas, mas sinto que estou fornecendo uma perspectiva diferente o suficiente para fazer com que isso valha a pena uma resposta, em vez de um comentário.)

Antes de abordarmos a questão de saber se uma especificação pode ser verdadeira e completamente inequívoca, devemos abordar a questão de saber se ela deve ser inequívoca, pelo menos no nível que você está perguntando.

Deixe-me abordar isso da perspectiva de um gerente de programa trabalhando em um projeto de tamanho pequeno a médio ou em um recurso como parte de um projeto maior. Geralmente, existem dois tipos diferentes de especificações que serão escritas para esse projeto: uma especificação Funcional (ou PM) e uma especificação Design (ou Dev):

  • A especificação Funcional tem a função de descrever o que o projeto ou recurso deve fazer, geralmente da perspectiva do cliente. Em geral, não deve descrever como isso deve ser feito. Dependendo do tipo de projeto, o cliente pode se importar com a aparência da API externa, mas o cliente se importa se a classe A herda da classe B ou implementa a interface C? Ele não deveria. E nem a especificação funcional. Isso já introduz um nível de ambiguidade: o do design técnico.
  • A especificação de Design tem a função de descrever como os requisitos funcionais devem ser atendidos, da perspectiva do arquiteto ou designer técnico do recurso ou projeto. Destina-se a resolver as ambiguidades de alto nível do projeto técnico. Isso conterá os detalhes que você não desejava na especificação funcional, como a arquitetura da solução, incluindo estrutura de classe, herança, talvez até funções e métodos individuais, dependendo do escopo e da escala do projeto. O arquiteto se importa com o que você chama de variáveis ​​temporárias ou se usa uma lista ou uma matriz para um tipo de dados interno? Assumindo que ela confia em seus desenvolvedores, ela não deveria, nem a especificação de design. Isso introduz um segundo nível de ambiguidade: o da implementação.

Em geral, esses detalhes no nível da implementação não são capturados em um documento formal, mas documentados, per se , no próprio código, incluindo os comentários. Esse nível de ambiguidade permite que um bom desenvolvedor use suas próprias habilidades e tome as decisões técnicas detalhadas que são a marca registrada de um bom desenvolvedor individual. Por causa disso, não hesitarei em dizer que a ambiguidade em uma especificação é, de fato, uma coisa boa: permite que os desenvolvedores realizem seus trabalhos e os eleva acima de meros "macacos de código".

Isso não quer dizer, no entanto, que deve haver ambiguidade em todo o documento. No alto nível, não deve haver ambiguidade sobre a interface com o cliente. Se o recurso tiver uma API voltada para o público, deve ser estritamente definida. Se o sistema exigir que uma data seja passada para seu trabalho, essa data deve estar no fuso horário local ou no UTC? Que formato é necessário? Precisa ser preciso até o milissegundo ou o minuto está bom?

Voltando à questão de saber se a linguagem natural pode ser usada para criar especificações inequívocas, é verdade que não é muito bom capturar esse nível de clareza. Eu já vi isso em certas circunstâncias limitadas, mas essas são provavelmente exceções únicas que não podemos aplicar universalmente. Na maioria das vezes, a ambiguidade é resolvida com a ajuda de jargões técnicos, diagramas ou mesmo pseudocódigo. Depois que você começa a recorrer à ajuda de tais ferramentas, a linguagem natural deixa de ser o único descritor. Como essas ferramentas podem tornar ainda mais clara uma especificação completamente funcional e inequívoca, arriscaria dizer que esse empreendimento nem deveria ser tentado.

Dito isto, como a linguagem natural é geralmente complementada por essas ferramentas para torná-la funcionalmente inequívoca, é minha opinião profissional que não, apenas a linguagem natural não é suficiente para criar especificações inequívocas em todos os casos.

Greg Jackson
fonte
0

Pode-se tornar a linguagem natural relativamente inequívoca, mas apenas com grande dificuldade.

A profissão de advogado precisa desesperadamente que a linguagem seja o mais inequívoca possível. Embora muito sobre como uma lei seja aplicada possa estar aberto à interpretação, o que as palavras significam não deve.

Esta necessidade levou à invenção dos juridicos. Até onde você está disposto a ir?

Waquo
fonte
0

Existem várias especificações do grupo aberto, ISO, IETF e ITU que são suficientemente inequívocas para empresas altamente competitivas interoperarem com êxito. Há várias especificações que são a base de contratos ou leis em que milhões de dólares estão em jogo.

Portanto, as especificações podem não ser "perfeitas". No entanto, isso ocorre porque os seres humanos não são perfeitos. Por exemplo, é inequívoco que o HTTP use um cabeçalho "Referer" - a ortografia correta é de fato "Referrer".

O idioma inglês é capaz de ser inequívoco, mas os seres humanos são capazes de cometer erros - incluindo ambiguidade.

Além disso, pode ser útil deliberadamente ambíguo para detalhes que não foram finalizados ou talvez precisem ser atualizados no futuro. Por exemplo, uma especificação pode especificar um "hash" em vez de especificar especificamente md5, sha1, crc32 etc.

teambob
fonte
0

Eu acredito que a resposta correta é negativa. É necessário distinguir as seguintes perguntas:

  1. É possível escrever uma especificação de software em uma linguagem natural que não contenha ambiguidades?
  2. É possível escrever software em uma linguagem natural que não contenha ambiguidades?

A diferença entre a primeira e a segunda pergunta diz respeito ao nível de detalhe envolvido, à quantidade de interpretação necessária e às regras impostas à construção de frases na linguagem natural para fins de redação do software ou especificação de software.

A resposta para a segunda pergunta é afirmativa. Dado um subconjunto adequadamente restrito de uma linguagem natural com regras acordadas para construção e significado de sentenças, o código pode ser escrito em sentenças gramaticais em inglês. Por exemplo, o idioma a seguir permite inequivocamente escrever instruções de atribuição:

Variables: x,y,z,...
Constants: 1,2,3,...
Rules: (1) if x is a variable and n a constant, then
           "The variable x contains the number n" is a sentence.
       (2) if x is a variable and n a constant, then
           "Assign the number n to the variable x" is a sentence.

Ou seja, podemos traduzir sistematicamente o código escrito em linguagens de programação formais em linguagens naturais, descrevendo cada procedimento. Por outro lado, uma especificação de software geralmente requer interpretação. Portanto, se uma especificação de software pode ser fornecida sem ambiguidade, depende do nível de detalhe envolvido na especificação. No entanto, dado um domínio selecionado no qual a especificação varia, com operações específicas nesse domínio selecionadas, um processo de conversão semelhante pode ser realizado. Por exemplo:

Over the domain D supporting operations f,g,h over elements a,b,c in relations
P,R,Q with properties φ,ψ,θ, design a program that does X,Y,Z.

onde as declarações X, Y, Zconter apenas os itens mencionados no prefácio do especificação e são escritos de forma formal adequadamente e acordados subconjunto de uma linguagem natural. As ambiguidades, então, dizem respeito a como implementar a especificação - mas isso será esperado.

danportin
fonte
0

Não

Uma especificação inequívoca de uma computação é um programa de computador.

Kevin Cline
fonte