SZOK! BIERNACKI MIAŻDŻY OOP! SPOŁECZNOŚĆ 4P OBURZONA! MODERATORZY WSTRZĄŚNIĘCI!
(Miałem zamiar dać taki tytuł wątku, bo ja jestem słaby z marketingu i jak pisałem o tym pomyśle w wątku o Chomiku to nikt nie odpowiedział. Ale teraz mam trochę kodu, więc pokażę co mi chodzi po głowie na przykładzie).
Na link jest taki prototyp systemu ekspertowego napisany przeze mnie w Chomiku (wymaga najnowszego Chomika!). Najpierw trzeba skonfigurować (./configure
), uruchamia się przez make run
.
Źródła są w katalogu main/
. Skłąda się na nie engine*.chomik
i domain_knowledge.chomik
. W domain_knowledge.chomik
jest opisana w tym systemie klasyczna sytuacja gdzie stosujemy twierdzenie Pitagorasa.
Teraz o OOP:
Mój pomysł polega na tym, że klasy istnieją, owszem, ale tylko tak jak enumy, to znaczy mają tożsamość. To samo obiekty, liczby rzeczywiste, liczby całkowite itd. Na początek tworzymy obiekty: ABC (trójkąt), odcinki AB, BC, CA, oraz liczby rzeczywiste "real zero", "real one", "length of AB", "length of BC", "length of CA". Obiekty, liczby rzeczywiste, całkowite, boolowskie, teksty i kody są opisane faktami. Fakty nie są obiektami!
Istnieje kilka "stopni" egzystencji obiektu. Obiekt może być nazwany, zdefiniowany, istniejący, konstruowalny, konstruowalny realistycznie (przy dostępnych zasobach), znany. Możemy mieć dobrze zdefiniowane i istniejące obiekty, które nie tylko nie są konstruowalne, ale mamy dowód na to, że nie da się ich skonstruować (twierdzenie o nierozstrzygalności).
W toku dalszej pracy program tworzy pojęcia oparte na klasach (trochę tak jakby były funkcjami), na przykład samodzielnie tworzy:
square ( real zero ) is known to exist: false
square root ( real zero ) is known to exist: false
square ( real one ) is known to exist: false
square root ( real one ) is known to exist: false
square ( length of AB ) is known to exist: false
square root ( length of AB ) is known to exist: false
square ( length of BC ) is known to exist: false
square root ( length of BC ) is known to exist: false
square ( length of CA ) is known to exist: false
square root ( length of CA ) is known to exist: false
sum ( real zero , real zero ) is known to exist: false
sum ( real zero , real one ) is known to exist: false
sum ( real zero , length of AB ) is known to exist: false
sum ( real zero , length of BC ) is known to exist: false
sum ( real zero , length of CA ) is known to exist: false
sum ( real one , real zero ) is known to exist: false
sum ( real one , real one ) is known to exist: false
sum ( real one , length of AB ) is known to exist: false
sum ( real one , length of BC ) is known to exist: false
sum ( real one , length of CA ) is known to exist: false
sum ( length of AB , real zero ) is known to exist: false
sum ( length of AB , real one ) is known to exist: false
sum ( length of AB , length of AB ) is known to exist: false
sum ( length of AB , length of BC ) is known to exist: false
sum ( length of AB , length of CA ) is known to exist: false
sum ( length of BC , real zero ) is known to exist: false
sum ( length of BC , real one ) is known to exist: false
sum ( length of BC , length of AB ) is known to exist: false
sum ( length of BC , length of BC ) is known to exist: false
sum ( length of BC , length of CA ) is known to exist: false
sum ( length of CA , real zero ) is known to exist: false
sum ( length of CA , real one ) is known to exist: false
sum ( length of CA , length of AB ) is known to exist: false
sum ( length of CA , length of BC ) is known to exist: false
sum ( length of CA , length of CA ) is known to exist: false
No i w następnej iteracji jeżeli dojdzie do tego, że np. "square ( length of AB)" istnieje i "square(length of BC)" istnieje, to utworzy pojęcie (nowy obiekt) "sum(square ( length of AB), square ( length of BC))". Czyli klasy działają trochę jak konstruktory w OOP. Mam nadzieję doprowadzić go do stanu, w którym zauważy, że dwa obiekty zdefiniowane automatycznie (tj. nie w domain_knowledge.chomik) są sobie równe i wyprowadzić metodę konstrukcji "length of CA".
Różni się to od OOP tym, że obiekty nie są utożsamiane z krotkami atrybutów, tylko każdy obiekt ma po prostu tożsamość, podobnie jak liczba rzeczywista czy inna, albo tekst. Poza tym obiekty mogą istnieć i być konstruowalne, ale nie realistycznie konstruowalne (tak jak np. rozwinięcie dziesiętne liczby PI). Albo istnieć i nie być konstruowalne. Albo mieć nazwę i definicję, ale nie istnieć (jak np. liczba X mniejsza od 0 i jednocześnie większa od 5). W sumie programista może w tym systemie zbliżyć się bardziej do matematyki niż w tradycyjnym OOP.
I pytanie - co o tym sądzicie.