Quelles classes de langage formel sont XML et JSON avec des clés uniques?

12

J'ai déplacé cette question de stackoverflow où id n'a obtenu aucune réponse. Nous avions une question similaire à savoir si JSON est régulier :

JSON et XML sont tous deux fréquemment appelés pour être des langages sans contexte - ils sont tous deux spécifiés principalement par une grammaire formelle dans EBNF. Cependant, cela n'est vrai que pour JSON tel que défini dans la RFC 4329, section 2.2, qui ne requiert pas l'unicité des clés d'objet (beaucoup ne le savent pas, mais {"a": 1, "a": 2} est un JSON valide!). Mais si vous avez besoin de clés uniques en JSON ou de noms d'attributs uniques en XML, cela ne peut pas être exprimé par des grammaires sans contexte. Mais quelle est la classe de langage de JSON avec des clés uniques et pour XML bien formé (ce qui implique des noms d'attribut uniques?).

L'un des meilleurs articles que j'ai trouvés à ce sujet (Murato et al, 2001: Taxonomy of XML Schema Languages ​​using Formal Language Theory ) exclut explicitement les contraintes d'intégrité telles que les clés / références de clés et l'unicité à vérifier sur une couche supplémentaire. À côté de cela, le sous-ensemble de XML défini par un schéma XML ou par une DTD est sans contexte. Mais pas l'ensemble complet de tous les documents XML bien formés.

Je pense qu'un automate de pile imbriqué (= langage indexé) devrait être capable d'analyser JSON avec une contrainte de clé unique. Car XML peut simplifier la question dans le langage S de toutes les listes séparées par des virgules d'entiers uniques. Quelqu'un en sait-il plus, de préférence avec des citations?

PS: Un algorithme simple pour décider des langues (à côté de la partie sans contexte) est basé sur un bon algorithme de tri. Par conséquent, il devrait être décidable en "temps linéithmique" avec le pire des cas O (n log n). Je n'ai pas encore découvert si la classe de complexité est par exemple "légèrement sensible au contexte" ou "indexée" mais probablement quelque chose entre sans contexte et sensible au contexte (?).

EDIT: Je ferais peut - être mieux de reformuler la question pour les informaticiens plus théoriques. Étant donné la classe CFL de toutes les langues qui peuvent être exprimées par Backus-Naur-Form avec répétition ( ). Maintenant, qu'est-ce que je gagne en puissance de calcul si j'introduis un opérateur "répétition avec des instances uniques" , est-ce donc une séquence où chaque élément se traduit par une séquence différente de terminaux?x := a+ x := a | x a^a^a

Jakob
la source
JSON avec des clés d'objet reproductibles est sans contexte (voir Grammaire JSON), mais comment exprimer la contrainte de clé unique dans une grammaire ou un automate commun? Ou: À quelle classe de complexité appartient un analyseur XML, s'il peut détecter l'ensemble de tous les documents XML bien formés (bien formé implique des noms d'attribut uniques par élément).
Jakob
1
Utilisation des termes du générateur de compilateur ici. La syntaxe respective de JSON et XML est certainement sans contexte. Des propriétés comme des identifiants uniques ou des restrictions de types de valeurs sont des sémantiques statiques (certaines personnes appellent également cette syntaxe, mais je rejette cette nomenclature pour plusieurs raisons). Les générateurs d'analyseurs vous permettent généralement d'enrichir un analyseur commun par des choses comme les prédicats syntaxiques / sémantiques qui n'ont pas besoin d'être sans contexte. En théorie, les grammaires attribuées sont utilisées. Je ne sais pas si de telles caractéristiques peuvent s'exprimer naturellement avec des grammaires formelles de quelque puissance que ce soit.
Raphael
1
Les parties d'un langage formel qui vont au-delà de la syntaxe dépendent du point de vue. Des structures imbriquées simples comme XML et JSON peuvent être analysées par un automate pushdown. Je veux juste savoir, quelle puissance calculable vous obtenez, si l'automate est enrichi d'un dictionnaire pour vérifier si une valeur stockée a été lue auparavant, pour garantir la contrainte d'unicité. Je suppose que c'est une grammaire indexée (un automate de pile imbriqué?) Mais il existe plusieurs types de grammaires indexées.
Jakob
@Jakob, je replierais cette discussion (en abrégé) dans la question pour qu'il soit clair exactement ce que vous demandez
Suresh Venkat
Un LBA devrait être suffisant car vous n'aurez jamais à stocker plus d'identifiants que vous avez de caractères dans votre texte. Je ne connais pas assez les classes entre CFL et CSL pour y être utile.
Raphael

Réponses:

6

L'utilisation de BNF avec votre opérateur de répétition unique, x := S^indique que an xest une instance ade symbole S, éventuellement suivie d'une instance bde set S - a, elle-même éventuellement suivie d'une instance cde set S - a - b, etc. Si |S|est le nombre de possibles Set est fini, alors 2 ^ |S|! - 1est le nombre de possibles S^.

Il n'est pas vraiment significatif de parler en termes de puissance de calcul du langage décrit, car il s'agit de sémantique statique, dans le crépuscule entre la syntaxe et la sémantique ordinaire (dynamique). Le pouvoir expressif de la grammaire est étendu, car elle dispose d'un moyen formel d'exprimer un type particulier d'adaptation d'entrée.

Plus précisément, il fournit un moyen d'accepter une permutation d'un sous-ensemble d'un ensemble particulier. Je ne pense pas qu'il existe un nom existant pour cette classe de langue. Ce n'est certainement pas sans contexte, mais l'exigence de contexte est au moins assez strictement contrôlée. Si vous avez besoin d'un terme pour cela, il suffit d'en inventer un. Je suggère le respect du contexte pour la classe des langages qui ne peuvent pas être décrits par une grammaire hors contexte sans informations supplémentaires intégrées sur les contraintes sémantiques statiques, qui pour être justes sont vaguement syntaxiques dans l'esprit.

L'application la plus utile de cette extension particulière est probablement simplement la possibilité d'introduire des contraintes de clé unique, mais elle vous permet également de décrire des ensembles intéressants tels que x := [0-7]^, qui correspondent à n'importe quel nombre octal de 8 chiffres non répétés ou moins. Quant à la complexité de celui-ci, déterminer si un élément de l'ensemble a été vu n'est pas pire que logarithmique, et la fréquence de vérification est linéaire dans le nombre d'éléments appariés, de sorte que l' ^opérateur est effectivement décidable dans le pire des cas.

Jon Purdy
la source
Merci pour la réponse et pour le conseil de penser en permutations d'un sous-ensemble. Bien que l'opérateur de répétition unique n'attrape pas les paires clé-valeur avec des clés uniques, la complexité doit être la même dans ce cas. Cependant, si je commence à appliquer l'opérateur sur des structures arbitraires, la classe S^où se Strouve certains CFL peut être non contextuelle car les CFL ne sont pas fermées par différence. Cela devrait être faisable s'il Ss'agit d'une langue régulière, mais malheureusement, vous ne pouvez pas décider si une LFC donnée est régulière. Je vais peut-être poser une autre question car cela dépasse les contraintes de JSON et XML.
Jakob