Sidebar

Najnowsze

  • Problemy cywilizacji związane z rozwojem sztucznej inteligencji
  • Nowy Traktat Logiczno-Filozoficzny
  • Czas i paradoksy logiczne
  • Wprowadzenie do alternatywnych miar złożoności obliczeniowej
  • Mechanizm wnioskowania w systemach przetwarzania danych
  • Współczesne interpretacje argumentu św Anzelma
  • Cyfrowe oczyszczanie logiki
  • Znaczenie a oznaczanie
  • Informatyka w służbie prawdzie
  • Problemy wirtualnej rzeczywistości
  • Tradycja Szkoły Lwowsko-Warszawskiej

Machine Translation

Polish Logic Polish Logic Polish Logic
  • Najnowsze
  • Konteksty
  • Filozofia
  • Przetwarzanie wiedzy
  • Teoria obliczeń

Czas i paradoksy logiczne

Szczegóły
Jerzy Wawro
Filozofia i logika
02 kwiecień 2018
Odsłony: 9952
Empty
  •  Drukuj 
  • E-mail

Czas a logika klasyczna1

Zdania w logice klasycznej opisują fakty (stan), a nie ich zmiany w czasie! Jeśli uznajemy zdanie za prawdziwe (fałszywe), tym samym uznajemy iż jego wartość logiczna nie zmienia się w czasie.
Na przykład zdanie 'jutro będzie padać deszcz' nie jest zdaniem logiki, gdyż nie umiemy ustalić jego wartości logicznej.

Możemy powiedzieć: 'dodając do liczby 2 liczbę 3 otrzymamy 5'. Wydaje się, że wyrażono tu jakiś ciąg czynności w czasie. Ale to jedynie opis zdeterminowanego wyniku działania. Wynik jest z góry przesądzony i dlatego możemy go podać. To, że posługujemy się przy tym czasownikiem jest jedynie środkiem wyrazu. Analogicznie możemy traktować każdy program komputerowy jako sieć logiczną2. Zamiana tego zapisu na instrukcje działania wykonywane w czasie powoduje jedynie zmniejszenie złożoności sieci logicznej na złożoność czasową (zamiast jednego złożonego działania ciąg prostszych wykonywanych w kolejnych chwilach czasu). Trudno więc mówić, że w ten sposób uwzględniono w komputerze czas taki jakim my go rozumiemy (jako doświadczaną zmienność). Prawdą pozostaje teza postawiona na początku: jeśli uznajemy zdanie za prawdziwe/fałszywe, tym samym uznajemy iż jego wartość logiczna nie zmienia się w czasie.

Opis działania komputera jest równoważny opisowi jego struktury, który da się przedstawić jako zbiór wyrażeń logicznych. Zauważmy przy tym, że takie wyrażenia nie są nigdy zapisem zdań fałszywych – nawet gdy dają na wynik 0 (fałsz). Na przykład zdanie: „koniunkcja daje na wynik fałsz, gdy wartości obu czynników koniunkcji (wejście) są fałszywe” jest prawdą! Opis działania komputera jest równoważny ze zbiorem zdań prawdziwych!

Dotyczy to wszystkich układów (maszyn) deterministycznych. Wątpliwości mogą dotyczyć jedynie tego, czy mamy do czynienia z determinizmem (jak w zdaniu 'jutro wzejdzie słońce'). Problemem jest też próba uwzględnienia czasu ciągłego (a nie dyskretnego). Prowadzi to do paradoksów związanych z nieskończonością. Z uwagi na to w tym artykule problem czasu ciągłego nie został poruszony.

Logika modalna i światy możliwe

Na początku tekstu podkreślone zostało to, że zdania logiczne służą do opisu faktów (stanu rzeczy). Kiedy fakty nie są znane w pełni, też możemy je opisać w sposób ścisły - choć niekoniecznie szczegółowy. Na przykład: 'jeśli rzucimy kostką do gry to otrzymamy ilość oczek od 1 do 6'. W tym przypadku można też skorzystać z pewnego rozszerzenia logiki klasycznej, a mianowicie logiki modalnej. W logice tej wprowadza się dwa operatory: jest konieczne oraz jest możliwe. Możemy więc powiedzieć: 'jest możliwe że rzucając kostką do gry otrzymamy 6 oczek'. Nie stanowi to istotnego wyłomu w deterministycznym charakterze logiki. Powszechnie takie zdania modalne interpretuje się w ten sposób, że pojawia się kilka światów możliwych. W każdym z nich wynik jest zdeterminowany. A więc na przykład w jednym ze światów możliwych rzucenie kostką da na pewno wynik 1 a w innym 6. Jeden z tych światów możliwych jest naszym światem realnym (choć możemy nie wiedzieć który). Operator „jest możliwe” oznacza że istnieje co najmniej jeden świat możliwy w którym zdanie jest prawdziwe. Operator „jest konieczne” zaś oznacza, że w każdym świecie możliwym rozważane zdanie jest prawdziwe.

Czytaj więcej: Czas i paradoksy logiczne

Wprowadzenie do alternatywnych miar złożoności obliczeniowej

Szczegóły
Maciej Wawro, Jerzy Wawro
Teoria obliczeń
13 marzec 2017
Odsłony: 8667
Empty
  •  Drukuj 
  • E-mail

Maszyna Turinga jako powszechnie przyjęty model obliczeniowy ma kilka wad. Najważniejszą z nich jest koncentracja na złożoności czasowej problemów (złożoność pamięciowa jest zawsze mniejsza od czasowej, więc nie ma potrzeby jej brać pod uwagę). W praktyce musimy uwzględnić zarówno czas jak i zasoby pamięci potrzebne do rozwiązania problemu. Jeśli w pamięci komputera zawarte są częściowe rozwiązania, może to przyspieszyć obliczenia. Można też poddać niezależnej analizie złożoność pamięciową – optymalizując ją na przykład przez kompresję.

Niniejszy artykuł pokazuje perspektywy badań nad złożonością, jakie otwierają się dzięki uwzględnieniu innego modelu obliczeniowego: systemów iteracyjnych.

Jedna z proponowanych koncepcji złożoności (sieci logiczne) jest obecnie rozwijana1, co potwierdza słuszność wniosków wysnutych na podstawie poniższej analizy.

System iteracyjny jako model obliczeniowy

Maszyna Turinga nie jest jedynym znanym modelem obliczeniowym. Wcześniej sformułowano rachunek lambda, a później systemy iteracyjne (Z. Pawlak)2. Powstał też model bardziej zbliżony do współczesnych komputerów: maszyny RAM3. Model maszyny Turinga z nieskończoną taśmą nie jest ani intuicyjny, ani praktyczny. Dlatego w niniejszym artykule analizę złożoności opartą o system iteracyjny.

Składa się on z pamięci, funkcji przejścia i zegara w takt którego wynik funkcji przejścia zapisywany jest do pamięci. Jeśli przyjmiemy, że pamięć składa się z elementów jednobitowych (0 lub 1), to funkcja przejścia staje się zbiorem funkcji logicznych, z których każda na podstawie zawartości pamięci wylicza nową wartość jednej komórki pamięci.

Model zaproponowany przez Z. Pawlaka nie obejmuje wydzielonego wejścia i wyjścia. Jednak nic nie stoi na przeszkodzie, aby dokonać stosownego rozszerzenia. W pamięci możemy więc teoretycznie wydzielić wejście oraz wyjście.

Wejście to część pamięci (teoretycznie może być cała) która zawiera dane wejściowe dla programu zaimplementowanego w postaci systemu iteracyjnego. Wyjście to z kolei część pamięci, której zmiana jest celem programu. Zmiana tej części pamięci oznacza zakończenie programu.

Obliczenia polegają na powtarzaniu zapisywania nowego stanu w pamięci tak długo, aż zostanie osiągnięty określony stan końcowy - na przykład zapisanie w części pamięci (na wyjściu) wyniku.

System iteracyjny (z określoną funkcją przejścia i zawartością początkową pamięci) oblicza wynik dla algorytmu zdeterminowanego przez funkcję przejścia i zapisane w pamięci dane (wejście). Aby uwzględnić możliwość użycia tego modelu dla takich samych obliczeń o różnych wejściach, proponujemy używać określenia „system iteracyjny Pawlaka” dla oznaczenia konstrukcji opisanej powyżej. Klasa systemów iteracyjnych Pawlaka różniących się między sobą zawartością wejścia odpowiada programowi obliczającemu wynik algorytmu dla dowolnych danych wejściowych. W dalszej części tekstu będziemy używać konsekwentnie nazwy „system iteracyjny” dla określenia takiej właśnie klasy systemów iteracyjnych Pawlaka.

Problem możemy zdefiniować jako zbiór algorytmów (systemów iteracyjnych) takich, że dla identycznych danych wejściowych dają identyczne wyniki.

Trzy proste elementy (pamięć, funkcja przejścia i zegar) przekładają się wprost na trzy miary złożoności systemu iteracyjnego:

  1. wykorzystywana pojemność pamięci;
  2. złożoność funkcji przejścia;
  3. czas

Złożoność pamięciowa może być mierzona ilością wykorzystywanych jednobitowych elementów pamięci.

Złożoność funkcji przejścia to suma ilości operatorów logicznych (bramek) wykorzystywanych w zdefiniowaniu wszystkich funkcji logicznych składających się na funkcję przejścia.

Natomiast złożoność czasowa to maksymalna ilość cykli zegara w czasie obliczeń.

Jeśli rozważamy konkretny system iteracyjny (program dla określonego algorytmu), to możemy założyć, że złożoność pamięciowa i złożoność sieci logicznej są stałe (maksymalna ilość wykorzystywana przy różnych danych), natomiast czas może się różnić zależnie od wielkości danych. To założenie nie jest teoretycznie konieczne, ale sprawia że model staje się intuicyjnie prosty.

Dla każdego problemu możemy stworzyć programy z minimalną pamięcią lub minimalną złożonością funkcji przejścia (a także szereg pośrednich):

  1. Zapisane w pamięci wszystkie możliwe wyniki obliczeń – wtedy obliczenia polegają na prostym odczycie ich na podstawie danych wejściowych. Funkcja przejścia jest pomijalna (obliczenia wykonane w jednym kroku)4.
  2. Złożona funkcja przejścia wylicza od razu wynik na podstawie danych wejściowych (początkowo w pamięci nie ma niczego poza danymi wejściowymi).

Zarys dowodu:

1. Możliwość zapisu wyników w pamięci jest trywialna.

2. Weźmy dowolny algorytm ze zdefiniowaną funkcją przejścia i pewną zawartością pamięci (wejścia). Jeśli algorytm wykonuje obliczenia w n krokach, możemy te obliczenia zapisać w postaci ciągu tych funkcji wchodzących w skład funkcji przejścia, które w kolejnym kroku wyliczyły nową zawartość pamięci. Ta wyliczona wartość jest wejściem dla funkcji użytych w następnym kroku. Nie musimy więc jej zapamiętywać, jeśli połączymy odpowiednio wyjście z funkcji użytych w poprzednim kroku z wejściem funkcji użytych w kroku następnym. W ten sposób skraca się czas – aż do pojedynczego kroku. Czyli funkcja przejścia może zastąpić pamięć.

Dwie nowe miary złożoności

Podane powyżej miary złożoności są bardzo praktyczne. Możemy dla każdego systemu obliczeniowego stosunkowo łatwo oszacować potrzebną pamięć, złożoność funkcji (ilość tranzystorów w procesorze?) oraz czas obliczeń.

Gdy rozważamy złożoność problemów, bardziej interesuje nas to jak ta złożoność zmienia się dla różnych algorytmów (programów) i różnych ilości danych. Możemy przyjąć, że złożoność problemu jest wielomianowa, jeśli istnieje taki program rozwiązujący (obliczający) ten problem, że wraz ze wzrostem ilości danych żadna z wielkości: pamięć, czas i złożoność funkcji przejścia nie rośnie szybciej niż wielomianowo.

1. Złożoność funkcji logicznej

Najprostszym automatem dokonującym obliczenia jest urządzenie wejściowe połączone z urządzeniem wyjściowym, przy użyciu sieci (funkcji) logicznej. Złożoność takiej sieci można określić podając ilość stanów pamięci potrzebnych do zapamiętania parametrów i wyniku, oraz ilość elementów w sieci.

Jak pokazano w poprzednim rozdziale, możliwa jest zamiana każdego systemu iteracyjnego na maszynę z pamięcią obejmującą jedynie elementy wejścia. System iteracyjny jest w tym przypadku tożsamy z samą siecią logiczną - obliczaną w jednym kroku, bez dodatkowej pamięci. W tej sytuacji złożoność algorytmu zostaje przeniesiona w całości na funkcję przejścia.

Miarą złożoności może być ilość bramek logicznych z których tą funkcję skonstruowano.

Można także podjąć badania takiej złożoności z wykorzystaniem automatycznych metod optymalizacji funkcji logicznych, takich jak metoda tablic Karnaugh, czy metoda Quine'a-McCluskeya5.

2.Złożoność jako wielkość pamięci.

Zdefiniowanie miary złożoności w postaci wielkości pamięci nie jest tak oczywiste jak w przypadku funkcji logicznych. Jeśli zapiszemy wszystkie wyniki w pamięci to czy jeszcze można mówić o obliczeniach? Jednak analiza wpływu wykorzystania pamięci na szybkość algorytmów może być obiecującym obszarem badań. Warto też w tym miejscu zauważyć, że takie szersze spojrzenie na problem złożoności (nie tylko sieci ale i pamięć) staje się bardzo naturalne przy wykorzystaniu modelu obliczeniowego w postaci systemów iteracyjnych.

Złożoność w zadaniach trudnych

Jak wiadomo problemy NP to takie, w których znając rozwiązanie, możemy sprawdzić jego poprawność w czasie wielomianowym. Doskonale to pasuje do proponowanych w artykule miar złożoności (złożoność sieci logicznej i wielkości pamięci). Załóżmy, że zamiast zgadywać – mamy możliwość odczytania zbioru potencjalnych rozwiązań z pamięci i sprawdzenia które z nich jest poprawne w czasie wielomianowym. Problem problemów NP-zupełnych sprowadza się do tego, czy pamięć lub złożoność sieci w takim systemie muszą rosnąć wykładniczo.

Załóżmy, że mamy funkcję wyliczającą zbiór danych wynikowych dla zadanych zmiennych:

P(dane) = wynik

i możemy ja przedstawić jako złożenie dwóch funkcji:

P(dane) = F(U(dane)) = wynik

Czyli najpierw wyliczamy przy pomocy U możliwe wyniki, a potem filtrujemy wielomianowym algorytmem F wyniki poprawne dla P.

W pamięci komputera możemy zapamiętać wszystkie możliwe wyniki U(dane) dla określonego zakresu danych. Jeśli algorytm wyliczenia w oparciu o te dane będzie działał wielomianowo – to mamy komputer rozwiązujący wielomianowo problem dla pewnego zakresu danych.

Można stąd wysnuć wniosek, że zużycie pamięci jako miary wiąże się z ograniczeniem maksymalnego rozmiaru problemu (pamięć nie może rosnąć w nieskończoność).

 

Przypisy

1 Sanjeev Arora and Boaz Barak, Computational Complexity: A Modern Approach Princeton University, 2009 [http://theory.cs.princeton.edu/complexity/]

2 Definicję systemów iteracyjnych podał Z. Pawlak w książce „Maszyny matematyczne”, Warszawa 1970, s. 9. Współczesne ich omówienie (jednak bez ścisłych definicji) można znaleźć w opracowaniu: http://www.math.uni.opole.pl/~ebryniarski/sys_iter.pdf. Ścisłą definicję można znaleźć w Andrzej Blikle, „Matematyka a informatyka — konflikty i związki” [w: Informatyka, IX/1972, http://delibra.bg.polsl.pl/Content/3209/Nr%209_72.pdf]. Później Z. Pawlak stworzył bardziej złożony model maszyny programowanej [„A mathematical model of digital computers” ] (http://bcpw.bg.pw.edu.pl/dlibra/docmetadata?id=1709&from=publication)

3 http://osilek.mimuw.edu.pl/index.php?title=Z%C5%82o%C5%BCono%C5%9B%C4%87_obliczeniowa/Wyk%C5%82ad_2:_Inne_modele_dla_z%C5%82o%C5%BCono%C5%9Bci

4 Ściśle rzecz ujmując, funkcja przejścia wciąż będzie mieć taką samą złożoność jak pamięć (bo wszystkie komórki pamięci muszą w niej być jakoś połączone bramkami).

5 http://www.bryk.pl/teksty/studia/pozosta%C5%82e/informatyka/15816-minimalizacja_funkcji_logicznych.html

Więcej artykułów…

  1. Mechanizm wnioskowania w systemach przetwarzania danych
  2. Współczesne interpretacje argumentu św Anzelma
  3. Cyfrowe oczyszczanie logiki
  4. Znaczenie a oznaczanie
  5. Informatyka w służbie prawdzie
  6. Problemy wirtualnej rzeczywistości
  7. Tradycja Szkoły Lwowsko-Warszawskiej
Strona 2 z 6
  • start
  • Poprzedni artykuł
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • Następny artykuł
  • koniec
Bootstrap is a front-end framework of Twitter, Inc. Code licensed under MIT License. Font Awesome font licensed under SIL OFL 1.1.