Maszyna turinga zadnie ze stworzeniem automatu

Maszyna turinga zadnie ze stworzeniem automatu
P Pepe
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:23
0

Witam,

mam problem z narysowaniem czy zrobieniem maszyny turinga w jflab, chociaż wystarczy odpowiednie rozwiązanie, moje zadanie jest takie mam język

L = {0^n^2 | n>= 0}

i musze stworzyć maszyne turinga, ale jakoś mi nie działa.

Mam taką i nie wiem czemu nie działa. Może ktoś pomóc.
screenshot-20201215220854.png

Tasmanian Devil
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.9981169)
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4892
2

A jak to Ci ta maszyna nie działa?


P Pepe
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:23
0

@lion137: no ma zatwierdzać odpowiednią ilość np: 1,2,9,16 i tak dalej, ale nie działa dla tych danych

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

2? A od kiedy 2 jest potęgą? o_O Chyba że nie rozumiem tego języka który opisałeś. Chodzi o akceptowanie ciągów 0 których liczba jest kwadratem liczby naturalnej? A co dokładnie robi ta maszyna którą narysowałeś? Jaki algorytm stosuje? Na jakiej podstawie decydujesz czy liczba jest kwadratem czy nie?
Wydaje mi się że najłatwiejsza opcja to odejmowanie kolejnych liczb nieparzystych bo np. 25 = 1+3+5+7+9 i jest to prawda dla każdego kwadratu. Więc maszyna turinga mogłaby zamazywać najpierw 1, potem 3, potem 5, potem 7 symboli... i jeśli zamaże wszystko to akceptujemy, a jeśli nam brakło to odrzucamy.
Czyli np.:

  1. Przygotowanie algorytmu: Idziemy na koniec inputu, stawiamy jakiś delimiter i za nim stawiamy jeden symbol A. Wracamy na początek taśmy.
  2. Teraz zaczyna sie właściwa pętla.
  3. Idziemy na koniec aż do delimitera, pomijamy wszystkie B, zamieniamy pierwsze napotkane A na B i wracamy na początek taśmy i usuwamy jeden symbol.
  4. Powtarzamy krok 3 aż skończyły nam się A (doszliśmy do blanka). Wtedy cofamy się do pierwszego B, zamieniamy wszystkie B na A i dopisujemy dwa A na końcu.
  5. Powtarzamy to aż:
  • szukając znaku do usunięcia trafiliśmy na delimiter inputu, wtedy odrzucamy
  • usunęliśmy ostatni symbol i trafiliśmy na delimiter i jednocześnie skończyły nam się wszystkie A, wtedy akceptujemy.

A symbolizują tutaj elementy które chcemy usuwać z inputu, czyli 1, 3, 5, 7..., B symbolizują elementy już usunięte w tej turze. Przykład:

input: 000
Po przygotowaniu: 000|A
Taśma w kolejnych krokach algorytmu:
000|B
_00|B
_00|AAA
_00|BAA
__0|BAA
__0|BBA
___|BBA
___|BBB
i tutaj odrzucamy bo brakło nam symboli do usunięcia.

Analogicznie dla 0000:

Po przygotowaniu: 0000|A
Taśma w kolejnych krokach algorytmu:
0000|B
_000|B
_000|AAA
_000|BAA
__00|BAA
__00|BBA
___0|BBA
___0|BBB
____|BBB
I tutaj akceptujemy bo zdjęliśmy ostatni symbol inputu a jednocześnie nie mamy już żadnych A


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 4x, ostatnio: Shalom
P Pepe
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:23
0

@Shalom: tak, powinno być 4, bo to faktycznie potęgi kolejnych liczb naturalnych,
tylko jak to przedstwić za pmocą grafu jak na zdjęciu

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Algorytm juz ci podałem, teraz rozpisz sobie tablicę przejść a potem ja namaluj i tyle. Ale tych stanów tam będzie dość sporo, chyba że istnieje jakis dużo łatwiejszy algorytm?

Na szybko:

stan symbol czytany symbol pisany kierunek nowy stan
p1 0 0 -> p1
p1 _ $ -> p2
p2 _ A <- r1
r1 $ $ <- r1
r1 0 0 <- r1
r1 _ _ -> s1
s1 0 0 -> s1
s1 $ $ -> s1
s1 B B -> s1
s1 A B <- r2
s1 _ _ <- c1
c1 B B <- c1
c1 $ $ <- c1
c1 _ ACCEPT
c1 0 0 -> a1
a1 $ $ -> a1
a1 B B -> a1
a1 B A -> a1
a1 _ A -> a2
a2 _ A <- r1
r2 B B <- r2
r2 A A <- r2
r2 $ $ <- r2
r2 0 0 <- r2
r2 _ _ -> s2
s2 0 _ -> s1
s2 $ REJECT

p1,p2 to ten preprocessing, gdzie idziemy na koniec, stawiamy sobie $ za inputem a potem stawiamy sobie A na końcu
s1,s2 to główna pętla algorytmu, s1 oznacza że idziemy na koniec i zamieniamy jedno A na B, s2 oznacza że idziemy w prawo i zamieniamy jedno 0 na blanka
r1,r2 to wracanie na początek inputu (r1 po preprocessingu a r2 w głównej pętli algorytmu)
a1,a2 są zeby dodać na końcu kolejne dwa A na obiegu pętli
c1 to sprawdzenie czy akceptujemy (tzn jeśli nie znaleźliśmy kolejnego A do zamiany na B sprawdzamy czy po lewej od $ jest juz tlyko blank czy jescze jakieś 0)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 5x, ostatnio: Shalom
P Pepe
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:23
0

@Shalom: Czy mógłbyś sprawdzić czy dobrze zrobiłam bo cos mi nie łapie 4 i powyżej
coś mniej więcej w tym momencice

a1 _ A -> a2
a2 _ A <- r1
r2 B B <- r2
r2 A A <- r2
r2 $ $ <- r2
r2 0 0 <- r2
r2 _ _ -> s2
s2 0 _ -> s1
s2 $ REJECT

edytowany 1x, ostatnio: P Pepe
Shalom
Rozpisałem to tam na szybko na kolanie. weź sobie po prostu prześledź wykonanie dla jakiegoś 00000 i 0000 ;] Może zrobiłem gdzieśtam w tej tablicy błąd, to bardzo możliwe. Ale sama idea algorytmu jest ok.
P Pepe
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:23
0

@Shalom: Hej jakby to wyglądało na wieloszynowej maszynie turinga?? Bo znowu mam z tym problem..

Shalom
Nie mam pojęcia co to jest maszyna wieloszynowa. Chyba że mówisz o maszynie z wieloma taśmami? W sumie żadna różnica, ot trochę mniej stanów bo nie trzeba jeździć wte i wewte
P Pepe
Tak chodzi o automat aby miał więcej niż 1 taśme, ale przynam nie ogarniam tego
P Pepe
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:23
0

@Shalom: Tak chodzi o automat aby miał więcej niż 1 taśme, ale przynam nie ogarniam tego

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No ale tu nie ma jednego poprawnego algorytmu. Możesz napisać co sobie chcesz. Np. w tym algorytmie który podawałem wyżej trzeba było kombinować z tymi dodatkowymi symbolami pisanymi na końcu, a tutaj mozesz je pisać na innej taśmie zamiast jeździć wte i wewte co chwila. Czyli te moje A i B trzymasz na drugiej taśmie i już.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
P Pepe
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:23
0

@Shalom: Próbowałam przerobić ten twoj algorytm ale nie chce mi to wyjść, wychodzi mi ablo za dużo stanów, albo nie łapie wyników

P Pepe
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:23
0

@Shalom: Wiesz może w jaki sposób obliczyć Wyznaczyć złożoność czasową maszyn Turinga dla tej maszyny ?? na jednej taśmie??

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Ale chcesz jakieś formalne wyliczenia? Na oko będzie n*(2*n+logn) gdzie n to długość inputu, bo usunięcie jednego symbolu (których jest n) kosztuje nas dwa przejścia po całej taśmie (2n), plus na końcu powoli rośnie nam jeszcze ten fragment z A/B który będzie miał jakieś logn długości.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
P Pepe
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad rok
  • Postów:23
0

@Shalom: jakbyś mógł formalne wyliczenia?? bo jakoś nie łapie..

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Nie wiem co tu można jaśniej opisać. Algorytm działa tak, ze "usuwa" z wejscia po 1 symbolu, a symboli jest n. Usuniecie jednego symbolu wymaga przejechania głowicą na koniec taśmy a potem znów na początek, czyli przelatujemy 2*n pozycji, plus jeszcze na końcu taśmy dopisujemy sobie te 1,3,5,7... więc taśma co 3 ruchy będzie dłuższa o 2 symbole, więc dorzucamy tam jakiś logn. Więc dla 1 symbolu potrzeba 2*n+logn a dla n symboli n*(2*n+logn)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)