Logika na co dzień
Główny nacisk jest tu położony na łatwość zapisywania algorytmów i mniejszą (np. w C) lub większą (w programowaniu obiektowym, jak C++, czy Java) łatwość opisu struktur danych. Programowanie polega tu na opracowaniu właściwych struktur danych oraz na wprowadzeniu algorytmu rozumianego jako dokładny opis procesu przetwarzania danych, precyzujący kolejne kroki do wykonania w danej sytuacji. Opis ten jest następnie kompilowany lub interpretowany i wykonywany przez komputer. W wielu obszarach zastosowań okazuje się, że to tradycyjne podejście może być zastąpione takim, w którym podaje się fakty i reguły, a same obliczenia pozostawia komputerowi. To podejście, zaproponowane przez Roberta Kowalskiego w roku 1972, zakłada zmianę powyższej zasady na zasadę:
algorytm = logika + sterowanie,
w której logika mówi o tym, jaki cel należy osiągnąć, zaś sterowanie o tym, jak osiągnąć oczekiwany cel. Następuje tu oddzielenie logiki od sterowania: logikę określa użytkownik, zaś sterowanie jest wyznaczane przez komputer. Pojawia się naturalne pytanie: czy taki cel można osiągnąć? Czyli - czy możliwe jest programowanie w logice?
Aby wyjaśnić zasadę wyznaczania przez komputer sterowania przyjrzyjmy się typowemu sposobowi rozumowania, w którym z posiadanej wiedzy staramy się uzyskać interesujące nas wnioski. Mamy więc pewną, być może złożoną, bazę wiedzy i reguły wnioskowania. Na przykład:
• z faktu, że Jan jest ojcem Marii i Jacka wnioskujemy, że Maria i Jacek są -być może przyrodnim - rodzeństwem,
• z faktu, że mamy zielone światło wnioskujemy, że możemy przejść przez ulicę (nadal zachowując pewną ostrożność).
Dane są więc fakty: „Jan jest ojcem Marii”, „światło jest zielone” oraz reguły, które na podstawie tych faktów pozwalają wyciągnąć wnioski „Maria i Jacek są rodzeństwem”, „możemy przejść przez ulicę”.
Pojawia się naturalne pytanie, w jakich dziedzinach zastosowań takie podejście ma sens, a w jakich zastosowanie podejść tradycyjnych jest się lepsze. Okazuje się, że podejście tradycyjne, oparte na algorytmach i strukturach danych, jest skuteczniejsze w zastosowaniach nastawionych na obliczenia numeryczne, w których podstawowe są operacje na liczbach, lub nastawionych na złożone struktury danych. W obliczeniach związanych z wnioskowaniem i przetwarzaniem danych symbolicznych (tj. nieliczbowych) wygodniejsze okazuje się podejście regułowe, wchodzące w skład deklaratywnej metody programowania, w której wyznacza się cele do osiągnięcia, pozostawiając komputerowi znalezienie metody osiągnięcia tych celów. Do języków deklaratywnych zaliczamy języki funkcyjne np. Lisp, Schema, ML, języki programowania w logice, jak
25