4. Rodzina – reguły pokrewieństwa

W języku programowania Prolog możemy utworzyć funkcje określające pokrewieństwo. Do zobrazowania i przetestowania działania funkcji posłuży nam fragment drzewa genealogicznego pewnego Krzyśka.

Najprostszym z pokrewieństw jest pokrewieństwo rodzic-dziecko. W tym przypadku będziemy tworzyć to w następujący sposób:

rodzic(kto,czyim).

rodzic(marek,jurek). – Marek jest rodzicem Jurka.

PAMIĘTAJ! Stałe piszemy małą literą!

a) Zgodnie z tym przykładem stwórz wszystkie możliwe fakty rodzic.

Rozwiązanie zadania

POBIERZ PROGRAM

rodzic(kto,czyim). – KTO jest CZYIM rodzicem.

rodzic(radek,julia). – Radek jest rodzicem Julii.

rodzic(marek,jurek). – Marek jest rodzicem Jurka.

rodzic(kasia,jurek). – Kasia jest rodzicem Jurka.

rodzic(julia,aga). – Julia jest rodzicem Agi.

rodzic(marcel,aga). – Marcel jest rodzicem Agi.

rodzic(marcel,franek). – Marcel jest rodzicem Franka.

rodzic(jurek,gosia). – Jurek jest rodzicem Gosi.

rodzic(aga,gosia). – Aga jest rodzicem Gosi.

rodzic(gosia,krzysiek). – Gosia jest rodzicem Krzyśka.

b) Mając już napisane fakty dotyczące kto jest czyim rodzicem, utwórz regułę dziecko – kto jest czyim dzieckiem.

Rozwiązanie zadania

POBIERZ PROGRAM

dziecko(kto,czyim). – KTO jest CZYIM dzieckiem.

dziecko(X,Y):-rodzic(Y,X).

X jest dzieckiem Y, jeżeli Y jest rodzicem X.

Jurek jest dzieckiem Kasi, jeżeli Kasia jest rodzicem Jurka.

c) Następnie napisz regułę matka – kto jest czyją matką, oraz ojciec – kto jest czyim ojcem.

Podpowiedź!

Rozwiązanie zadania

Pierwszym etapem stworzenia reguł matka/ojciec jest napisanie faktów kobieta/mężczyzna, które pomogą nam w utworzeniu wyżej wymienionych reguł. Fakty kobieta/mężczyzna tworzymy poprzez napisanie predykatu określającego płeć, a w nawiasach wpisujemy imię osoby, której ta płeć odpowiada, cały fakt kończymy kropką.

kobieta(kasia).

mezczyzna(marek).

Następnym krokiem jest już tworzenie reguł. Na początku zajmiemy się regułą matka. Musimy się zastanowić, które stworzone już reguły i fakty opisują matkę – matka musi być rodzicem i oczywiście kobietą. Dzięki tym informacjom jesteśmy w stanie utworzyć zadaną regułę.

X jest matką Y jeżeli X jest rodzicem Y i X jest kobietą.

matka(X,Y):-rodzic(X,Y),kobieta(X).

Analogicznie tworzymy regułę ojciec – ojciec musi być rodzicem i mężczyzną.

POBIERZ PROGRAM

Istnieje jeszcze jedna możliwość utworzenia reguł matka/ojciec. Mianowicie tym razem bierzemy pod uwagę, że matka musi mieć dziecko i być kobietą.

X jest matką Y, jeżeli Y jest dzieckiem X i X jest kobietą.

matka(X,Y):-dziecko(Y,X),kobieta(X).

W analogiczny sposób tworzymy regułę ojciec – ojciec musi mieć dziecko i być mężczyzną.

POBIERZ PROGRAM

d) Stwórz reguły syn/córka – kto jest czyim synem/córką.

Rozwiązanie zadania

Reguły syn/córka będziemy tworzyć w podobny sposób do tworzenia reguł matka/ojciec. Na początku musimy zastanowić się, jakie fakty i reguły opisują syna – syn jest dzieckiem i jest mężczyzną.

X jest synem Y jeżeli X jest dzieckiem Y i X jest mężczyzną.

syn(X,Y):-dziecko(X,Y),mezczyzna(X).

Regułę córka tworzymy w analogiczny sposób – córka musi być dzieckiem i kobietą.

POBIERZ PROGRAM

Tak samo, jak było w przypadku reguł matka/ojciec, tak i tym razem istnieje jeszcze jeden sposób na opisanie pokrewieństwa syn/córka. Mianowicie syn musi mieć rodzica i być mężczyzną.

X jest synem Y jeżeli Y jest rodzicem X i X jest mężczyzną.

syn(X,Y):-rodzic(Y,X),mezczyzna(X).

Regułę córka tworzymy w ten sam sposób – córka musi mieć rodzica i być kobietą.

POBIERZ PROGRAM

e) Korzystając z napisanych reguł utwórz reguły dziadek i babcia – kto jest czyją babcią, bądź czyim dziadkiem.

Rozwiązanie zadania

Początkowym etapem utworzenia reguł dziadek/babcia jest, tak samo jak w poprzednich przypadkach, zastanowienie się jakie fakty i napisane już przez nas reguły opisują dziadka/babcię. Jako pierwszą zajmiemy się regułą dziadek. W poprzednich zadaniach opisywaliśmy pokrewieństwa dotyczące albo tego samego pokolenia, albo jednego w górę/dół. Tym razem różnica pokoleń, jaką musimy wziąć pod uwagę, jest większa. Dziadka i wnuka łączy pokolenie rodziców – dziadek musi mieć jakieś dziecko, które ma swoje dziecko, i oczywiście dziadek musi być mężczyzną. Dziadek mając swoje dziecko jest rodzicem, w dodatku mężczyzną, co opisuje nam już istniejąca reguła – ojciec. Dziadek jest ojcem dla swojego dziecka, a to dziecko jest rodzicem dla wnuka. Wynika z tego, że:

X jest dziadkiem dla Y, jeżeli dziadek X jest ojcem Z, a Z jest rodzicem Y.

Gdzie X to dziadek, Y to wnuk, a Z to rodzic dla dziecka i dziecko dla dziadka.

dziadek(X,Y):-ojciec(X,Z),rodzic(Z,Y).

W ten sam sposób tworzymy regułę babcia – babcia jest matką dla swojego dziecka, a jej dziecko jest rodzicem dla jej wnuka.

POBIERZ PROGRAM

f) Napisz reguły siostra/brat – kto jest czyją siostrą/bratem.

Podpowiedź!

Rozwiązanie zadania

Regułę siostra/brat rozpoczynamy od tego samego, czyli od zastanowienia się jakie fakty i reguły pomogą nam w opisaniu tego pokrewieństwa. Wspólnie przyjrzymy się regule siostra – aby być dla kogoś siostrą musimy posiadać przynajmniej jednego wspólnego rodzica, siostra musi być kobietą i uwaga! siostra nie może być siostrą sama dla siebie!

X jest siostrą dla Y, jeżeli Z jest rodzicem dla X i Z jest rodzicem dla Y oraz X jest kobietą i X nie jest Y.

siostra (X,Y):-rodzic(Z,X),rodzic(Z,Y),kobieta(X),X\=Y.

Regułę brat tworzymy analogicznie – aby być dla kogoś bratem musimy posiadać co najmniej jednego wspólnego rodzica, brat musi być mężczyzną i brat nie może być bratem dla samego siebie.

POBIERZ PROGRAM

Jednak, jeżeli dobrze się przyjrzymy, zauważymy, że pewien fragment stworzonej przez nas reguły możemy opisać w krótszy sposób poprzez inną regułę – w przypadku siostry regułę rodzic(Z,X) i kobieta(X) możemy zamienić na regułę córka(X,Z).

X jest siostrą dla Y, jeżeli X jest córką Z, Z jest rodzicem Y i X nie jest Y.

siostra(X,Y):-corka(X,Z),rodzic(Z,Y),X\=Y.

W ten sam sposób możemy skrócić regułę brat.

POBIERZ PROGRAM

g) Utwórz procedurę przodka.

Rozwiązanie zadania

Procedura to dwie lub więcej reguł.

Tworząc procedurę przodek musimy założyć, że przodkiem jest każdy, kto znajduje się w wyższych pokoleniach niż nasze. Czyli naszymi najbliższymi przodkami są nasi rodzice, a potem rodzice rodziców, itd. Z tego wynika, że do napisania proceduty przodek potrzebujemy regułę rodzic.

Pierwszą częścią naszej procedury jest to, że rodzic jest naszym przodkiem.

X jest przodkiem dla Y, jeżeli X jest rodzicem Y.

przodek(X,Y):-rodzic(X,Y).

Drugą częścią jest to, że rodzice rodziców są naszymi przodkami.

X jest przodkiem Y, jeżeli X jest rodzicem Z i Z jest rodzicem Y.

przodek(X,Y):-rodzic(X,Z),rodzic(Z,Y).

Jednak, by program nie kończył poszukiwań na dziadkach musimy w niewielkim stopniu przekonstruować część proceduty. Aby program mógł wyświetlić rodziców dziadków, a potem rodziców tych rodziców itd., musimy napisać, że przodek jest rodzicem jakiegoś naszego przodka.

X jest przodkiem Y, jeżeli X jest rodzicem Z i Z jest przodkiem Y.

przodek (X,Y):-rodzic(X,Z),przodek(Z,Y).

W ten sposób możemy wyświetlić wszystkich możliwych przodków, dłuuugie pokolenia wstecz, co bez przekonstruowania procedury byłoby niemożliwe. Tak samo, jak bez pierwszej części procedury nie było by możliwe wyświetlenie rodziców jako przodków – możesz usunąć tę część procedury z programu i przetestować program, wpisując zapytanie czyim przodkiem jest Gosia. Patrząc na drzewo genealogiczne jest ona przodkiem Krzysia, jednak program nie uwzględnił by tego w swoich poszukiwaniach. Dlatego nasza procedura musi składać się z dwóch reguł.

Wykorzystano tu relacje przechodnią – X jest przodkiem dla Y, jeżeli X jest rodzicem Y oraz X jest przodkiem Y, jeżeli X jest rodzicem Z i Z jest przodkiem Y.

POBIERZ PROGRAM

h) Utwórz następujące zapytania do stworzonego programu:

  • Kto jest przodkiem Krzyśka?

    Rozwiązanie zadania

  • Kto jest siostrą Franka?

    Rozwiązanie zadania

  • Czy Kasia ma córkę? – użyj zmiennej anonimowej!

    Rozwiązanie zadania

  • Czyim dziadkiem jest Marek?

    Rozwiązanie zadania

  • Kto jest dzieckiem Marcela?

    Rozwiązanie zadania

  • Czyim dzieckiem jest Gosia?

    Rozwiązanie zadania

POBIERZ CAŁY PROGRAM

Komentowanie jest wyłączone.