Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Prolog - nieco inne podejście do programowania

Większość popularnych języków programowania nauczyło nas, że programowanie polega na opisywaniu komputerowi kolejnych kroków które ma wykonać. Wyobraźmy sobie jednak sposób tworzenia programów, w którym mówimy jedynie jak wygląda rozwiązanie, a od komputera wymagamy żeby sam do takiego wyniku doszedł. Tak właśnie działają języki deklaratywne (w dużym uproszczeniu, za które fanatycy mnie ukamienują). Najbardziej znanym przykładem takiego języka jest... SQL. Większość użytkowników tego języka nie jest nawet świadoma, że używa języka deklaratywnego, ale zastanówmy się przez chwilę. Nie mówimy przecież komputerowi jak ma wyszukać dane, rozkazujemy tylko:

Ziomuś, dawaj mi id usera o nicku kubut, ale znajdź je sobie jak chcesz
Nie da się ukryć, że jest to wygodne podejście do sprawy, ponieważ nie musimy martwić się implementacją przeszukiwania bazy danych ani żadnych innych operacji. Jako, że SQL jest dość popularny, dzisiaj chciałbym napisać parę słów na temat języka o nazwie Prolog. Podkreślam, że będzie to parę słów, nie kurs ;)

Trochę nudnych rzeczy o Prologu

Jak się zapewne domyślacie w Prologu także nie będziemy definiować w jaki sposób ma dojść do wyniku (choć w ograniczonym zakresie możemy to robić), będziemy natomiast żądać od niego, by sam rozwiązał nasz problem. Zalatuje sztuczną inteligencją? To dobrze, bo Prolog dobrze radzi sobie z wyzwaniami jakie stawia tworzenie sztucznego "mózgu". W Prologu nasze programy tworzymy na zasadach logiki pierwszego rzędu, czyli przygotujmy się na masę koniunkcji, alternatyw, czy implikacji.
Ogólnie program prologowy składa się z definicji faktów i reguł. Pierwszym co należy powiedzieć o składni, to fakt, że linijkę (czy dokładniej - regułę/fakt) kończymy kropką, natomiast średnik traktowany jest jako alternatywa (or). Będziemy używać także przecinka jako koniunkcji (and) oraz :- jako czegoś w stylu
A jest spełnione :-(jeśli) B jest spełnione
Brzmi trochę strasznie, ale zaraz się rozjaśni. Zanim jednak będziemy mogli prologować potrzebujemy jakiegoś narzędzia które nam to umożliwi. Polecam SWI Prolog który pobrać można na stronie http://www.swi-prolog.org/. Progrm uruchamiamy, następnie wybieramy File->New by stworzyć nowy zestaw faktów. Następnie w konsoli prologa wczytamy nasz plik i będziemy mogli "rozmawiać" z maszyną prologową wypytując ją o różne ciekawe rzeczy.

Trochę przykładów

Zobaczmy może jak wygląda to w praktyce. Zacznijmy od faktów, które definiujemy w następujący sposób: polaczenie(katowice,krakow). polaczenie(krakow,warszawa). polaczenie(warszawa,wroclaw).Mówi to tyle, że istnieje połączenie z Katowic do Krakowa itp. Należy zaznaczyć przy tym ważną rzecz - w Prologu nazwy zaczynające się małą literą są stałą, natomiast wielką - zmienną. Dlatego też taki fakt:polaczenie(Katowice,krakow).będzie mówił, że z każdego miasta (bo nieważne co podstawimy pod zmienną Katowice) istnieje połączenie do Krakowa.
Zapiszmy nasz plik pod nazwą test.pl (pl to rozszerzenie pików Prologa) oraz przejdźmy do konsoli. Pierwsze co musimy zrobić, to wczytać nasz plik z faktami, robimy to przez wpisanie do konsoli
[test].
Następnie spytajmy, czy z Warszawy dojedziemy do Wrocławia:
?- polaczenie(warszawa,wroclaw).
Oczywiście dostaniemy odpowiedź True. Co jednak gdy chcemy dojechać z Katowic do Warszawy? Nie istnieje połączenie bezpośrednie, więc Prolog odpowie False. Jeśli chcemy umożliwić przesiadki musimy zdefiniować regułę, która będzie mówiła kiedy można dojechać z A do C z przesiadką. Powiedzmy to najpierw po polsku:
z A można dojechać do C jeśli istnieje połączenie z A do B oraz z B do C
lub
z A można dojechać do C jeśli istnieje połączenie z A do C
Teraz możemy przepisać to do naszego pliku test.plprzesiadka(A,C) :- polaczenie(A,B), polaczenie(B,C) ; polaczenie(A,C)Teraz po ponownym wczytaniu tego pliku do maszyny prologowej po zapytaniu
?- przesiadka(katowice,warszawa).
Dostaniemy napis True.

Skomplikujmy bardziej!

Niby wszystko fajnie, ale co gdy chcemy wyszukać połączenie z dowolną liczbą przesiadek? Nie będziemy przecież pisać osobnej reguły dla każdej możliwej liczby przesiadek. Zastanówmy się chwilę, jak powiedzieć, że z A można dojechać do B z dowolną liczbą przesiadek? Wbrew pozorom nie jest to trudne, zacznijmy jednak od powiedzenia tego w sposób naturalny.
z miasta A można dojechać do miasta B jeśli istnieje bezpośrednie połączenie z A do B
lub
z miasta A można dojechać do miasta B jeśli istnieje bezpośrednie połączenie z A do Z, a z Z można dojechać (z przesiadkami) do B
Zawiłe? Może trochę, ale jak się w to wczytamy to nie jest to głupie. Zapiszmy to zatem zamiast naszej poprzedniej definicji reguły "przesiadka".przesiadka(A,B) :- polaczenie(A,B); polaczenie(A,Z) , przesiadka(Z,B).Mamy tutaj coś na styl rekurencji znanej z języków imperatywnych. Kod ten ma lekki defekt, mianowicie wpada w "pętle" gdy w zbiorze faktów będziemy mieli zamknięty cykl, jednak nie będę przedłużał wpisu omawiając jak to rozwiązać.

Słowo na koniec

Wyszło trochę dłużej i nudniej niż zamierzałem, jednak Prolog (jak wszystkie języki) to temat-rzeka i można pisać o nim w nieskończoność. Dokładnie poznają go wszyscy którzy pójdą na studia informatyczne na Uniwersytet Wrocławski. Być może porwę się na kontynuowanie tematu w kolejnym wpisie, jeśli będzie takie zapotrzebowanie (choć nie liczę na to) ;) Jako ciekawostkę na koniec powiem, że w bardzo prosty sposób możemy przygotować reguły, które rozwiążą nam "zagadkę Einsteina" i zajmie to o wiele mniej czasu niż rozwiązywanie jej na kartce ;) 

programowanie

Komentarze

0 nowych
TheUsh   7 #1 04.04.2013 00:15

- Ilu programistów Prologa potrzeba aby wykręcić żarówkę?
- False

  #2 04.04.2013 00:16

ja tam wolę dodać klauzulę polaczenie(A,B) :- polaczenie(A,C), polaczenie(C,B).

  #3 04.04.2013 00:30

"Najbardziej znanym przykładem takiego języka jest... SQL" "Ziomuś, dawaj mi id usera o nicku kubut, ale znajdź je sobie jak chcesz"
Bzdura. Jak nie zdefiniujesz CO i GDZIE ma wyszukać, to nic z tego nie będzie :).

"Ogólnie program prologowy składa się z definicji faktów i reguł" właśnie :)! Jak nie ustalisz reguł, to napij się wody :D Nie ma mowy o sztucznej inteligencji. To tylko zbiór reguł i sam je musisz zapisać, bo program za Ciebie i sam z siebie tego nie zrobi :).

kubut   18 #4 04.04.2013 00:50

Tak, ostatnio wykładowca opowiedział to na wykładzie, na sali zapadła niezręczna cisza :)

Mifczu   12 #5 04.04.2013 08:07

Prolog to ciekawy język bo zupełnie inny od reszty. Ciekaw jestem jaka jest tego wydajność jakby danych było np z 1mln i różna ilość przeskoków :) Nie widziałem jeszcze praktycznego poza uczelnianego zastosowania tego języka.

myszak_miki   1 #6 04.04.2013 08:59

Moim skromnym zdaniem wszędzie tam, gdzie trzeba wspomagać decyzje, tam prolog może okazać się praktyczny. Przykład. Mamy wiedzę o ktosiu, który chce wziąć kredyt. Dostarczamy dane, a program w prologu przedstawia nam czy kredyt udzielić bądź jaka ma być jego kwota. Przykład2. Aplikacje wyszukujące drogi (problem komiwojażera). Szukamy optymalnej drogi przez listę miast. Problem bardzo podobny do tego jaki przedstawił autor w artykule. W zasadzie dodajemy tylko optymalizator i funkcję kryterialną (trasa ma być jak najkrótsza). Można te przykłady mnożyć ;)
Polecam książeczkę:
http://www.pwlzo.pl/download.php

Autor edytował komentarz.
Frankfurterium   10 #7 04.04.2013 10:21

Obyś nigdy nie musiał pisać w "niby" deklaratywnym OCL-u. Tam mimo wszystko do rozwiązania trzeba poprowadzić za rączkę przy pomocy mieszanki Pascala, C++ i lispa...


Ale o Prologu chętnie bym jeszcze coś poczytał, bo właśnie ludzie z UWr ze znajomością tego języka wymiatali na programowaniu systemów wspomagania decyzji. My tworzyliśmy nie wiadomo jakie projekty w Javach i SiSzarpach, a oni takie malutkie cosie w Notatniku :-/

LordRuthwen   6 #8 04.04.2013 11:57

Miałem prologa na studiach, toż to dziwne było :P

kubut   18 #9 04.04.2013 13:14

@LordRuthwen - ja właśnie mam (nawet teraz mam przerwę podczas ćwiczeń z prologa) :P Jest dziwne, fakt, ale kiedy nikt nie zmusza do rozwiązywania wymyślonych zadań, to jest to nawet dość ciekawe :)

Druedain   14 #10 04.04.2013 13:35

Na początku Prolog jest fajny. Ale potem przychodzi zabawa z rekurencją i wtedy można wysiąść…

lincoln2491   4 #11 04.04.2013 14:13

@Druedain
Jak to mawiali u nas na studiach, "żeby zrozumieć rekurencję, trzeba zrozumieć rekurencję." Co jest takiego złego w rekurencji w prologu? IMO nie jest jakaś straszna.

kwpolska   5 #12 04.04.2013 19:44

Rozszerzenie .pl? Jak w Perlu?

Jim1961   7 #13 04.04.2013 20:32

@kwpolska
i nie tylko: http://www.fileinfo.com/extension/pl

@język
co za tępa strzała przyjęła takie oznaczenia ... hispter jakiś czy co :/

  #14 04.04.2013 21:49

@Jim1961:
Lepsze takie niż .prl ;]

okokok   12 #15 05.04.2013 00:58

Będzie kontynuacja? Chętnie bym poczytał.

kubut   18 #16 05.04.2013 01:32

Hm... pojawiają się głosy zainteresowania, więc postaram się coś jeszcze naskrobać o Prologu, mimo że specjalistą ani znawcą nie jestem :)

soanvig   10 #17 05.04.2013 23:13

"Jako ciekawostkę na koniec powiem, że w bardzo prosty sposób możemy przygotować reguły, które rozwiążą nam "zagadkę Einsteina" i zajmie to o wiele mniej czasu niż rozwiązywanie jej na kartce ;)
Wiki:
"Implementacja programu rozwiązującego zagadkę jest szczególnie łatwa w językach programowania logicznego, takich jak Prolog."
;p

kubut   18 #18 05.04.2013 23:55

@soanvig - szczerze mówiąc nie czytałem tego z wiki, po prostu miałem na uczelni jako jedno z zadań :) Ale to tym bardziej potwierdza moje słowa :)

przemor25   14 #19 06.04.2013 20:10

@Jim1961
Każdy programista jest na swój sposób hipsterem :)

mikajlo   2 #20 07.04.2013 23:24

Widzę, że w 'szkole' męczą Cię z prologa :P Też swojego czasu miałem z nim przyjemność..

Co do zastosowania prologa, to zdziwilibyście się w jak wielu miejscac jest on wykorzystywany.. (przede wszystkim logika I rzędu..). I powiem więcej - to przyszłościowa "technologia".. ;)

  #21 08.04.2013 10:21

Haskell następny. W zeszłym roku na UWr pisaliśmy interpreter Haskella w Prologu. To była dopiero zabawa :)

kubut   18 #22 08.04.2013 10:46

Z tego co się dowiedzieliśmy TWi (wykładowca od Programowania) w tym roku nie da interpretera ;) Oby...

Otho Sackville   2 #23 08.04.2013 16:22

Myślałem, że tego uczą tylko na Polsl ;)

  #24 23.04.2013 13:37

Te Jackob i tak niezdasz xD kiedy wpis o haskell'u?

  #25 08.10.2013 18:52

Nie działa mi program. Mam kłopot z poprawnym ułożeniem "goal" i redundantnym przejściem przez wszystkie pytania odnośnie objawów. Zauważyłam też, że nawiasami w prologu nie można uzyskać odzwierciedlenia działań logicznych takiego np. typu (A OR B) AND (C OR D OR E)
jak takie coś uzyskać np. przy tutaj w programie rozpatrywaniu schorzeń? Zamieszczam wersję programu bez zapisu nawiasowego a jedynie z prostymi OR i AND. Będę wdzięczna za pomoc w poprawie programu.

program jest długi jedynie ze względu na dane, najważniejsze to ułożyć goal, na razie nie udało mi się - tj. wyświetlało np. jedynie pierwsze pytanie i po udzieleniu prawdziwej odpowiedzi - stop

/*niektore schorzenia kardiologiczne*/
/***********************************************/
domains
symptom = symbol
symptomtext = symbol
problem =symbol
problemtext =symbol

database

/***********************************************/
predicates /*jakby deklaracja relacji, te typy nie uzywane potem,
cos jak deklaracja funkcji, (bez kropek)*/
symptomy(symptom, symptomtext) /*np. symptomy(kaszel, "kaszel")*/
objaw(symptom) /*stwierdzenie wystepowania jakiegos objawu*/
odp(char) /*przyjecie opowiedzi w zapytaniu o wystapienie symptomu*/
schorzenie(problem, problemtext) /*np. schorzenie(barykardia,"barykardia") problem zdrowotny i jednoczesne stwierdzanie jego wystepowania*/
podsumowanie
zdrowy
pytanie1
/*razem*/

/***********************************************/
/*goal /*cel, obliczanie celu polega na wykazaniu, ze istnieja spelniajace go wartosci, czynnosc powtarzana póki "fail" ? */
razem.*/


/***********************************************/
clauses /*jakby definicje funkcji*/

/*(3)*/
objaw(A):- clearwindow and symptomy(A,B) and write("Czy odczuwasz:",B, "? (t/n)") and Odp(O) and O='t'. /*wystepowanie objawu*/
odp(O):- readchar(O), write(O), nl.

pytanie1:- write ("Czy problemy z sercem nasilaja sie w nocy, w stanie spoczynku (t/n)?") and Odp(O) and O='t'.

/*(4)*/
podsumowanie:- write("Skonsultuj z lekarzem swoj stan zdrowia. MoZesz miec problemy z: ", D) and schorzenie(C,D).
zdrowy:- not(podsumowanie) and write("Wydaje sie, Ze nie masz problemow kardiologicznych.").


/*(1)*/
symptomy(kaszel, "kaszel").
symptomy(kaszel_suchy, "uporczywy suchy kaszel").
symptomy(kaszel_odpluwanie, "kaszel z odpluwaniem").
symptomy(krwioplucie, "krwioplucie").
symptomy(omdlenia, "omdlenia").
symptomy(zawroty_glowy, "zawroty glowy").
symptomy(oslabienie, "oslabienie").
symptomy(zmeczenie, "zmeczenie, uczucie wyczerpania").
symptomy(szybkie_meczenie_sie, "szybkie meczenie sie").
symptomy(problemy_z_oddychaniem, "problemy z oddychaniem").
symptomy(przysp_o, "przyspieszenie i skrocenie oddechu").
symptomy(bol_w_klatce_piersiowej, "bol w klatce piersiowej").
symptomy(zaburzenia_snu, "zaburzenia snu").
symptomy(problemy_z_pamiecia, "problemy z pamiecia").
symptomy(obrzeki_konczyn, "obrzeki konczyn").
symptomy(obrzeki, "obrzeki konczyn dolnych"). /*lekkie powt.*/
symptomy(obrzek_kostek_i_podudzi, "obrzek kostek i podudzi").
symptomy(spadek_wagi, "spadek wagi"). /*!!*/
symptomy(chudniecie, "utrata masy ciala o 4,5 kg lub wiecej"). /*!!*/
symptomy(dusznosci, "dusznosci").
symptomy(dusznosc_w, "dusznosc wysilkowa").
symptomy(dusznosc_nocna, "napady dusznosci nocnej").
symptomy(dusznosc_spoczynkowa,"dusznosc spoczynkowa").
symptomy(dretwienie_konczyn, "dretwienie konczyn").
symptomy(dretwienie_rak, "dretwienie rak").
symptomy(dretwienie_i_mrowienie_dloni, "dretwienie i mrowienie dloni").
symptomy(zaburzenia_czucia_w_stopach, "zaburzenia czucia w stopach"). /*x*/
symptomy(biegunka_lub_zaparcia, "biegunka lub zaparcia").
symptomy(powiekszenie_jezyka, "powiekszenie jezyka").
symptomy(zmiany_skorne, "zmiany skorne").
symptomy(szara_skora, "szare zabarwienie skory").
symptomy(wybroczyny, "wybroczyny").
symptomy(bladosc, "bladosc skory").
symptomy(arytmia, "nieregularny rytm bicia serca (arytmia)"). /*jako objaw, mozna potraktowac jako schorzenie*/
symptomy(plamy_wokol_oczu, "plamy wokol oczu").
symptomy(podbiegniecia, "krwawe podbiegniecia na skorze").
symptomy(prob_polykanie, "problemy z polykaniem").
symptomy(uczucie_pelnosci, "uczucie pelnosci, nawet po zjedzeniu niewielkiego posilku").
symptomy(powiekszenie_watroby, "powiekszenie watroby").
symptomy(bialko_w_moczu, "bialko w moczu").
symptomy(kolatanie, "kolatanie serca"). /*jako objaw, moZna potraktowac jako schorzenie*/
symptomy(szybsze_bicie, "czucie szybszego bicia serca").
symptomy(mocne_bicie_serca, "mocno bijace serce").
symptomy(bicie_po, "przyspieszone bicie serca w zwiazku ze stresem, lekami lub po: zwiekszonym wysilku fizycznym, wypiciu kawy, herbaty, alkoholu, paleniu tytoniu, zazyciu lekow lub srodkow odurzajacych").
symptomy(klucie_w_klatce, "klucie w klatce piersiowej").
symptomy(goraczka, "goraczka").
symptomy(stan_podgoraczkowy, "stan podgoraczkowy").
symptomy(dreszcze, "dreszcze").
symptomy(powiekszenie_sledziony, "powiekszenie sledziony").
symptomy(zawal_sledziony, "zawal sledziony").
symptomy(palce_paleczki, "objaw paleczkowatych palcow").
symptomy(pocenie_sie, "pocenie sie").
symptomy(lepki_pot, "lepki pot").
symptomy(dlawienie, "dlawienie w gardle").
symptomy(mdlosci, "mdlosci").
symptomy(niepokoj, "niepokoj").
symptomy(dyskomfort, "dyskomfort w klatce piersiowej").
symptomy(bole_serca, "bole serca").
symptomy(bole_uciski, "bole i uciski w okolicy serca").
symptomy(bol_na_konczyny, "promieniujacy bol na konczyny").
symptomy(promieniowanie, "bol promieniujacy od mostka w strone lopatek, Zuchwy lub podbrzusza").
symptomy(pieczenie_k_serca, "uczucie pieczenia wokol serca")./*?*/
symptomy(mostek_bol, "piekacy, gniotacy bol w okolicy mostka"). /*?*/
symptomy(bol_z, "bol promieniujacy, zamostkowy, >30 min. nawet w stanie spoczynku, nie ustaje po nitratach").

/*bol o charakterze zawalowym: gniotacy, piekacy bol zamostkowy, penetrujacy do lewej reki,
przestrzeni miedzylopatkowej, Zuchwy, >30min., wystepuje nawet podczas spoczynku, nie ustaje po nitratach*/

symptomy(bole_wiencowe, "bol promieniujacy, zamostkowy,5-17 min., wystepuje dopiero po wysilku, ustaje po nitratach").

/*bole wiencowe: gniotacy/piekacy bol zamostkowy, penetrujacy do lewej reki,
przestrzeni miedzylopatkowej, Zuchwy, 5-17 min., wystepuje dopiero po wysilku, ustaje po nitratach*/

symptomy(tachykardia, "tachykardia, czyli czestoskurcz - przyspieszenie akcji serca ").
symptomy(spadek_cisnienia, "spadek cisnienia tetniczego").
symptomy(powiekszenie_serca, "powiekszenie sylwetki serca").
symptomy(zastoj_p, "zastoj w plucach").
symptomy(zaslabn_w, "zaslabniecia przy wysilku").
symptomy(mi_przeds, "migotanie przedsionkow").
symptomy(niewydolnosc, "niewydolnosc serca"). /*jako objaw, mozna potraktowac jako schorzenie*/
symptomy(zmniejszona_kon, "zmniejszona koncentracja uwagi").
symptomy(czestoskurcz_serca, "czestoskurcz serca"). /*bb*/
symptomy(bole_glowy, "bole glowy").
symptomy(szmery_w_sercu, "szmery w sercu").
symptomy(chrypka, "chrypka").
symptomy(brak_apetytu, "zmniejszenie laknienia").
symptomy(powiekszenie_l_kom, "powiekszenie lewej komory serca").
symptomy(infekcje, "czeste infekcje gornych drog oddechowych").
symptomy(ciezko, "ogolny stan chorego ciezki").
symptomy(pobudzenie_psycho_ruch, "pobudzenie psycho-ruchowe").
symptomy(nocne_oddawanie_moczu, "nocne oddawanie moczu").
symptomy(wodobrzusze, "wodobrzusze").
symptomy(rozpieranie_podzebrze, "rozpieranie w prawym podZebrzu").

/*(2) ze wzgledu na rozmaite objawy chorob: definiowane kazda z osobna, predykat schorzenie można okreslic tylko dla 2giego arg.*/
schorzenie(barykardia, "barykardia") :-
objaw(problemy_z_oddychaniem)AND
objaw(bol_w_klatce_piersiowej)AND
objaw(omdlenia)OR
objaw(zawroty_glowy)OR
objaw(oslabienie)OR
objaw(zmeczenie)OR
objaw(zaburzenia_snu)OR
objaw(problemy_z_pamiecia)OR
pytanie1.

schorzenie(amyloidoza,"amyloidoza") :-
objaw(arytmia)OR
objaw(dusznosci)AND
objaw(oslabienie)OR
objaw(zawroty_glowy)OR
objaw(szybkie_meczenie_sie)AND
objaw(dretwienie_i_mrowienie_dloni)OR
objaw(zaburzenia_czucia_w_stopach)OR
objaw(obrzek_kostek_i_podudzi)OR
objaw(zmiany_skorne)OR
objaw(plamy_wokol_oczu)OR
objaw(podbiegniecia)OR
objaw(prob_polykanie)OR
objaw(uczucie_pelnosci)OR
objaw(biegunka_lub_zaparcia)OR
objaw(powiekszenie_watroby)OR /*lub*/
objaw(powiekszenie_sledziony)OR
objaw(bialko_w_moczu)OR
objaw(spadek_wagi)OR
objaw(powiekszenie_jezyka).

schorzenie(arytmia,"arytmia"):-
objaw(kolatanie)OR
objaw(szybsze_bicie)OR
objaw(mocne_bicie_serca)OR
objaw(klucie_w_klatce)OR
objaw(oslabienie)OR
objaw(dusznosci)OR
objaw(zaburzenia_snu)OR
objaw(bol_w_klatce_piersiowej)OR
objaw(omdlenia).

schorzenie(bakteryjne_zapalenie_wsierdzia,"bakteryjne zapalenie wsierdzia"):-

objaw(goraczka)OR
objaw(zmeczenie)OR
objaw(dusznosci)OR
objaw(szara_skora)OR
objaw(wybroczyny)OR
objaw(powiekszenie_sledziony)OR
objaw(zawal_sledziony)OR
objaw(palce_paleczki).

schorzenie(dusznica_bolesna,"dusznica bolesna - choroba niedokrwienna serca"):-
objaw(bol_w_klatce_piersiowej)OR
objaw(bol_na_konczyny)AND
objaw(bole_uciski)OR
objaw(pieczenie_k_serca)OR
objaw(dusznosci)OR /*a miały być 2 bloki spośród których przynajmniej jeden objaw*/
objaw(niepokoj)OR
objaw(pocenie_sie)OR
objaw(dlawienie)OR
objaw(mdlosci)OR
objaw(zawroty_glowy)OR
objaw(zmeczenie).

schorzenie(zawal_serca,"zawal serca"):-
objaw(mostek_bol)AND
objaw(promieniowanie)AND /*choc miala byc grupa 4 pierwszych objawow z ktorych przynajmniej jeden
(a nie jak tu: kazdy) musi wystapic plus ktorys z grupy dodatkowych*/
objaw(dretwienie_rak)AND
objaw(dusznosci)AND
objaw(stan_podgoraczkowy)OR
objaw(bladosc)OR
objaw(lepki_pot)OR
objaw(mdlosci)OR
objaw(dreszcze)OR
objaw(spadek_cisnienia).

schorzenie(zapalenie_miesnia_s,"zapalenie miesnia sercowego"):-
objaw(zmeczenie)OR
objaw(oslabienie)OR
objaw(dusznosci)OR
objaw(przysp_o)OR
objaw(dyskomfort)OR
objaw(tachykardia)OR
objaw(szybkie_meczenie_sie)AND
objaw(bol_z)AND
objaw(mostek_bol)AND
objaw(promieniowanie).


schorzenie(kardiomiopatia_roz,"kardiomiopatia rozstrzeniowa"):-
objaw(kolatanie)OR
schorzenie(kolatanie,"kolatania serca")OR
objaw(dusznosc_w)OR
objaw(bole_wiencowe)OR /*niekiedy*/
objaw(mostek_bol)OR /*niekiedy*/
objaw(promieniowanie)OR /*niekiedy*//*czasem teZ poniZsze*/
objaw(zastoj_p)OR
objaw(powiekszenie_watroby)OR
objaw(obrzeki)AND
objaw(bole_uciski)AND
objaw(powiekszenie_serca).

schorzenie(kardiomiopatia_przer,"kardiomiopatia przerostowa"):-
objaw(dusznosc_w)OR
objaw(zawroty_glowy)OR
objaw(zmeczenie)OR
objaw(omdlenia)OR
objaw(zaslabn_w)OR
objaw(arytmia)AND /*zaburzenia rytmu serca */
objaw(mi_przeds).

schorzenie(kardiomiopatia_rest,"kardiomiopatia restrykcyjna"):-
objaw(szybkie_meczenie_sie)OR /*oslabiona tolerancja wysilku*/
objaw(zmeczenie)OR
objaw(oslabienie)OR
objaw(dusznosci)OR
objaw(bol_w_klatce_piersiowej)AND /*rzadko*/
objaw(mi_przeds)AND
objaw(niewydolnosc)OR
schorzenie(niewyd,"niewydolnosc serca, kraZenia").

/*schorzenie(kolatanie,"kolatania serca"):- /*!*/
objaw(bole_serca)AND
objaw(szybsze_bicie)AND
objaw(bicie_po)AND
objaw(czestoskurcz_serca)AND
objaw(oslabienie)OR
objaw(goraczka)OR /* szybkie bicie serca z goraczka*/
objaw(bladosc)OR
objaw(bole_glowy)OR
objaw(zmniejszona_kon).

schorzenie(niedomykalnosc_zastawki,"niedomykalnosc zastawki mitralnej"):-
objaw(szmery_w_sercu)OR
objaw(powiekszenie_l_kom)AND
objaw(kolatanie)OR /*!*/
schorzenie(kolatanie,"kolatania serca")AND
objaw(dusznosci)OR
objaw(kaszel)OR /*szczegolnie w nocy i w pozycji leZacej*/
objaw(chrypka)OR
objaw(brak_apetytu)OR
objaw(obrzek_kostek_i_podudzi)OR /*dokladnie kostek*/
objaw(infekcje).

schorzenie(niewyd,"niewydolnosc serca, kraZenia"):-
objaw(dusznosc_w)OR
objaw(zmeczenie)OR
objaw(oslabienie)OR
objaw(chudniecie)),
objaw(obrzeki_konczyn).


schorzenie(niewyd_lewokomorowa,"ostra lewokomorowa niewydolnosc serca"):-
objaw(przysp_o),
objaw(dusznosc_spoczynkowa)AND
objaw(kaszel_odpluwanie)OR
objaw(ciezko)OR
objaw(bladosc). /* skora blada, niekiedy zasiniona*/

schorzenie(niewyd_prawokomorowa,"ostra prawokomorowa niewydolnosc serca"):-
objaw(dusznosci)OR
objaw(kaszel_suchy)OR
objaw(kaszel)OR
objaw(niepokoj)AND
objaw(pocenie_sie)OR
objaw(omdlenia)OR
objaw(pobudzenie_psycho_ruch),
objaw(szybsze_bicie).

schorzenie(przewlekla_niewyd_lewokomorowa," przewlekla lewokomorowa niewydolnosc serca"):-
objaw(dusznosc_w)AND
objaw(dusznosc_nocna)AND
objaw(kaszel)OR
objaw(infekcje)OR
objaw(obrzek_kostek_i_podudzi). /*obrzeki konczyn dolnych*/

schorzenie(przewlekla_niewyd_prawokomorowa,"przewlekla prawokomorowa niewydolnosc serca"):-
objaw(oslabienie)OR
objaw(nocne_oddawanie_moczu)OR
objaw(wodobrzusze)OR
objaw(szybsze_bicie)AND
objaw(rozpieranie_podzebrze). */

/*, - OR ,- AND*/

  #26 08.10.2013 18:54

gdyby ktoś prologa nie posiadał, bo wcale o niego nie jest prosto ...
na 32-bitach http://www.cmpe.boun.edu.tr/courses/cmpe320/spring2003/downlo.html oczywiście, o ile publikowanie tego tu nie narusza żadnych praw, nie orientuję się

  #27 10.10.2013 00:11

za goal dałam podsumowanie.

przy takiej jego modyfikacji podsumowanie:- schorzenie(C) and write("Skonsultuj z lekarzem swoj stan zdrowia. MoZesz miec problemy z: ", C).

Ale i tak leci po schorzeniach - czyli powtarza pytania. A więc źle obmyślona zasada. Nie zadaje też pytania pytanie1 ani nie wyświetla info zdrowy.

(zmodyfikowałam predykat schorzenie(symptomtext), żeby nie wyskakiwało powiadomienie o raz użytej zmiennej)

Na razie odkładam tę zabawę na jakiś czas, ale dzięki za każdą sugestię.

  #28 22.03.2015 03:52

Ktoś się orientuje jak w prologu skomentować liste np [1,2,3,44,55] na liczbe?