Witam,
napisałem prosty programik, przedstawiający drzewo genealogiczne. Został mi do rozwiązania jeden problem. Otóż nie działa ostatnia część czyli zliczanie liczby potomków. Nie bardzo mam pomysł jak inkrementować wartość "liczba_potomków". Proszę o pomoc.
% Author: Robert Kaszubowski
% Date: 2013-04-16
/*
Treść zadania:
Wyrazić w Prologu wszelkie relacje rodzinne takie jak:
dziadek, babcia, syn, dziecko, córka, brat, siostra,
stryj(brat ojca), wuj(brat matki), ciotka, potomek, przodek, kuzyn, żona, mąż,
krewny, liczba potomków itd.
dla dowolnej bazy danych, która zawiera relacje: ojciec(s,s), matka(s,s), plec(s,s).
*/
% Przykladowa baza danych:
ojciec(edward,halina). % ojciec(jestOjcem, potomek).
ojciec(jan,adam).
ojciec(piotr,krzysztof).
ojciec(jan,maria).
ojciec(adam,monika).
ojciec(adam,norbert).
matka(halina,monika).
matka(monika,maciej). % matka(jestMatka, potomek).
matka(ewa,maria).
matka(ewa,adam).
matka(maria,krzysztof).
plec(maciej,m).
plec(norbert,m).
plec(piotr,m).
plec(krzysztof,m).
/*
przykładowo program powinien odpowiadać na zapytania:
kuzyn(krzysztof,norbert) -> yes
dziadek(edward,monika) -> yes
maz(adam,halina) -> yes
potomek(maciej,jan) -> yes
krewni(maciej,krzysztof) -> yes
dziadek(jan,X) -> X=’monika’,X=’norbert’,X=’krzysztof’
liczba_potomkow(X,jan) -> X=6
*/
plec(edward,m).
plec(jan,m).
plec(ewa,k).
plec(halina,k).
plec(adam,m).
plec(maria,k).
plec(monika,k).
plec(krzysztof,m).
% syn(X,Y) prawda gdy X jest mezczyzna i Y jest rodzicem X.
% zapytanie - syn(X,Y), czy X jest synem Y?
% X\=Y - zeby uniknac dublowania sie rezultatow.
syn(X,Y) :- plec(X,m), ojciec(Y,X),X\=Y.
syn(X,Y) :- plec(X,m), matka(Y,X),X\=Y.
corka(X,Y) :- plec(X,k), ojciec(Y,X),X\=Y.
corka(X,Y) :- plec(X,k), matka(Y,X),X\=Y.
% dziecko ma dowolna plec.
dziecko(X,Y) :- ojciec(Y,X),X\=Y.
dziecko(X,Y) :- matka(Y,X),X\=Y.
% rodzic - odwrotnie do dziecka.
rodzic(X,Y) :- dziecko(Y,X),X\=Y.
% rodzenstwo - para ludzi, ktorzy maja wspolnych rodzicow lub rodzica.
rodzenstwo(X,Y) :- rodzic(Z,X),rodzic(Z,Y),X\=Y,X\=Z,Y\=X.
brat(X,Y) :- plec(X,m),rodzic(Z,X),rodzic(Z,Y),X\=Y,X\=Z,Y\=X.
siostra(X,Y) :- plec(X,k),rodzic(Z,X),rodzic(Z,Y),X\=Y,X\=Z,Y\=X.
% wuj - brat matki.
wuj(X,Y) :- matka(Z,Y),brat(X,Z),X\=Y,X\=Z,Y\=Z.
% stryj - brat ojca
stryj(X,Y) :- ojciec(Z,Y),brat(X,Z),X\=Y,X\=Z,Y\=Z.
% ciotka - siostra matki lub brata.
ciotka(Y,X):-matka(Z,X),siostra(Y,Z),X\=Y,X\=Z,Y\=Z.
ciotka(Y,X):-ojciec(Z,X),siostra(Y,Z),X\=Y,X\=Z,Y\=Z.
babcia(B,A):-rodzic(C,A),rodzic(B,C),plec(B,k),A\=B,A\=C,B\=C.
dziadek(B,A):-rodzic(C,A),rodzic(B,C),plec(B,m),A\=B,A\=C,B\=C.
% zona - kobieta, ma dziecko, i to dziecko ma jeszcze jednego rodzica.
zona(X,Y) :- plec(X,k),dziecko(Z,X),dziecko(Z,Y),X\=Y,X\=Z,Y\=Z.
maz(X,Y) :- plec(X,m),dziecko(Z,X),dziecko(Z,Y),X\=Y,X\=Z,Y\=Z.
% kuzyn - mezczyzna, ktory jest synem wuja lub ciotki.
kuzyn(X,Y) :- plec(X,m),dziecko(X,Z),wuj(Z,Y),X\=Y,X\=Z,Y\=Z.
% wymagana rekurencja.
potomek(X,Y) :- rodzic(Y,X).
potomek(X,Y) :- rodzic(Z,X),potomek(Z,Y).
% przodek - odwrotnie do potomka.
przodek(X,Y) :- dziecko(Y,X).
przodek(X,Y) :- dziecko(Z,X),przodek(Z,Y).
% krewny - dowolny stopien relacji rodzinnych.
krewny(X,Y) :- dziecko(X,Y);rodzic(X,Y);kuzyn(X,Y);babcia(X,Y);dziadek(X,Y),X\=Y.
% Y ma X potomkow
liczba_potomkow(X,Y) :- potomek(_,Y),X is X+1. % <- To nie dziala.