2010-05-02 7 views
2

Mon langage de programmation n'a pas des tableaux, pas de listes, pas de pointeurs, pas eval et aucune variable variable. Tout ce qu'il a:tableaux de mise en œuvre à l'aide d'une pile

  • Les variables ordinaires comme vous les connaissez dans la plupart des langages de programmation: Ils ont tous un nom exact et une valeur.

  • Une pile. Fonctions fournies sont: push (Ajouter un élément vers le haut), pop (retirer l'élément de haut, obtenir la valeur) et vide (vérifier si la pile est vide)

Ma langue est Turing-complet. (Arithmétique de base, sauts conditionnels, etc.) Cela signifie qu'il doit être possible d'implémenter une sorte de liste ou de tableau, n'est-ce pas?

Mais je ne sais pas comment ...

Ce que je veux atteindre: Créer une fonction qui peut récupérer et/ou modifier un élément x de la pile.

Je pourrais facilement ajouter cette fonction dans l'implémentation de mon langage, dans l'interpréteur, mais je veux le faire en mon langage de programmation.

  • "Solution" une (accès à un élément x, en comptant à partir du haut de la pile)

créer une boucle. Éclatez l'élément du dessus de la pile x fois. Le dernier élément apparu est le numéro d'élément x. Je me retrouve avec une pile détruite.

  • Solution deux:

Faites la même chose que ci-dessus, mais stocker toutes les valeurs dans un sauté hors seconde pile. Ensuite, vous pouvez déplacer tous les éléments après que vous avez terminé. Mais tu sais quoi? Je n'ai pas de deuxième pile!

+0

Sons comme 'Forth': http://en.wikipedia.org/wiki/Forth_(programming_language) –

+0

Forth a des pointeurs et allot (qui lui donne des tableaux) et une deuxième pile bien. –

Répondre

2

Avez-vous des appels de procédure et récursion? Ensuite, vous avez une deuxième pile, la pile d'appel. Si non, êtes-vous sûr que c'est Turing complet, et pas seulement un PDA?

+0

J'ai une pile d'appels, oui - mais elle n'est pas accessible depuis la langue interne. C'est une partie interne de l'interprète. – Zack

+1

N'a pas besoin d'être directement accessible. Si vos procédures peuvent avoir des variables locales et prendre en charge la récursivité, vous pouvez les utiliser pour restaurer la pile. –

+0

Bien sûr, il suffit de recurcir l'empilement lorsque vous recurerez et pousserez lorsque vous reviendrez. Cependant, affirmer dans votre question que vous n'avez qu'une seule pile est un peu trompeur. – WhirlWind

3

sonne comme une question de devoirs, comme fléchissant bits aléatoires de l'informatique ...

Je pense que vous voulez utiliser la récursivité pour le faire. Dire que j'ai quelque chose comme ça ..

Queue globalQueue = new Queue(); 

alors je pourrais avoir le code qui a obtenu l'élément X comme celui-ci

public Object findElement(stepsToTake s) { 

    if (queue.empty()) { 
     throw new EmptyQueueYouFailException(); 
    } 

    Object o = queue.pop(); 


    if (s == 0) { 
     queue.push(o); 
     return o; 
    } 

    Object actualResult = findElement(s - 1); 
    //restore this element to the stack 
    queue.push(o); 
    //return actual result 
    return actualResult; 
} 

donc plus que probable que je fait un bug ... ont pas pensé à travers elle super bien. Surtout inquiet que je vais réorganiser la pile à cause de l'ordre de mes appels ..

Espérons que cela peut vous faire réfléchir dans la bonne direction pour obtenir une solution?

+1

Alors comment mémoriser o? – WhirlWind

+0

Eh bien, je m'empare du dessus .. puis soit le cas de base ou le cas récursif, o se remet en place. Je ne pense pas que je perds un o avec mon algo, mais je n'ai pas pensé à quel ordre l'os finit avant et après – bwawok

+0

Merci pour votre exemple de code, je pense que j'ai une idée de ce qu'il faut faire maintenant. Et btw: Pourquoi pensez-vous que ce soit les devoirs? Je veux dire ... Je n'ai pas mentionné un langage de programmation spécifique ni demandé de code! Votre exemple de code ne fonctionnera pas pour ma langue, cependant: Il n'a pas de portée et donc la variable o sera écrasée par l'appel de fonction suivant. – Zack

2

Si vous n'avez qu'une seule pile, cela équivaut à un automate à pile, qui peut reconnaître des langages sans contexte et qui n'est pas complet à Turing. Votre preuve de l'exhaustivité de Turing doit indiquer comment implémenter l'accès libre à la mémoire. En général, pour prouver Turing-complétude, vous devez être capable de montrer comment votre langage peut se déplacer de gauche à droite sur une bande (ou simuler indirectement ce processus), ce qui correspond à peu près à un seul tableau de niveau supérieur.

+0

Strange: http://stackoverflow.com/questions/1389981/can-a-language-be-turing-complete-without-any-support-for-arrays – Zack

+0

Ceci est une question de compréhension de ce que "tout support pour les tableaux" veux dire. Le calcul lambda n'a pas de tableaux en tant que primitif, mais vous pouvez certainement créer des tableaux (de toute façon, le tableau est généralement compris comme impliquant certaines choses sur l'implémentation et finalement certaines choses sur le matériel) sur les primitives qu'il vous donne . –

+0

@Zack "Vous pouvez, cependant, simuler une structure de données linéaire comme une liste en chaînant des fonctions ensemble." - De cette même question. Comment feriez-vous cela avec ce langage si votre affirmation concernant une seule pile est vraie? – WhirlWind