Estou criando uma máquina virtual orientada a pilha e, então, comecei a aprender a Forth para uma compreensão geral sobre como ela funcionaria. Em seguida, selecionei as operações essenciais de manipulação de pilha que precisaria implementar na minha máquina virtual:
drop ( a -- )
dup ( a -- a a )
swap ( a b -- b a )
rot ( a b c -- b c a )
Acredito que as quatro operações de manipulação de pilha a seguir possam ser usadas para simular qualquer outra operação de manipulação de pilha. Por exemplo:
nip ( a b -- b ) swap drop
-rot ( a b c -- c a b ) rot rot
tuck ( a b -- b a b ) dup -rot
over ( a b -- a b a ) swap tuck
Dito isto, porém, eu queria saber se listei todas as operações fundamentais de manipulação de pilha necessárias para manipular a pilha de qualquer maneira possível.
Existem operações de manipulação de pilha mais fundamentais que eu precisaria implementar, sem as quais minha máquina virtual não estaria completa com Turing?
rot rot
como uma alternativa para-rot
? O que acontece quando há mais de 3 itens na pilha? Você não precisariarot
tantasLength-1
vezes quantas vezes conseguir-rot
?dup
,swap
erot
eu usopick ( a_n ... a_0 n -- a_n ... a_0 a_n)
e emroll ( a_n ... a_0 n i )
vez disso. Sei
for negativo,roll
desloca os elementos para a esquerda; mais para a direita.Respostas:
Muitas linguagens baseadas em pilha também usam
roll
, o que é generalizadorot
em um número arbitrário de elementos na pilha. Eles também implementam a operação reversa para girar a pilha para o outro lado.Eu diria que
roll
é mais fundamental querot
.Ainda não tenho resposta sobre Turingness disso.
fonte
Brent Kirby estabelece uma série de bases computacionais completas de operações de pilha em sua Teoria dos combinadores concatenativos . Você precisa de alguma noção de "cotação" dos termos da pilha. Usando sua nomenclatura, os seguintes conjuntos de combinadores são todos completos de Turing:
Usando minha nomenclatura preferida, um conjunto completo conveniente para implementar é:
fonte