Prolog - pomoc w zadaniu

0

Witam, nie działa mi kod napisany w prologu, chciałbym aby ktoś pomógł mi rozwiązać w czym tkwi problem i dlaczego owe zadanie nie daje odpowiedzi. Treśc 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)

Przykładowo dla bazy:

ojciec(edward,halina).
ojciec(jan,adam).
ojciec(piotr,krzysztof).
ojciec(jan,maria).
ojciec(adam,monika).
ojciec(adam,norbert).
matka(halina,monika).
matka(monika,maciej).
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

% Moje zadanie

ojciec(edward,halina). 
ojciec(jan,adam).
ojciec(piotr,krzysztof).
ojciec(jan,maria).
ojciec(adam,monika).
ojciec(adam,norbert).
matka(halina,monika).
matka(monika,maciej). 
matka(ewa,maria).
matka(ewa,adam).
matka(maria,krzysztof).
plec(maciej,m).
plec(norbert,m).
plec(piotr,m).
plec(krzysztof,m).
 
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) :- 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(X,Y) :- ojciec(Y,X),X=\=Y.
dziecko(X,Y) :- matka(Y,X),X\==Y.
 
rodzic(X,Y) :- dziecko(Y,X),X\==Y.
 
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(X,Y) :- matka(Z,Y),brat(X,Z),X\==Y,X\==Z,Y\==Z.

stryj(X,Y) :- ojciec(Z,Y),brat(X,Z),X\==Y,X\==Z,Y=\=Z.

ciotka(X,Y) :- matka(Z,Y),siostra(X,Z),X\==Y,X\==Z,Y\==Z.
ciotka(X,Y) :- ojciec(Z,Y),siostra(X,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(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(X,Y) :- plec(X,m),dziecko(X,Z),wuj(Z,Y),X\==Y,X\==Z,Y\==Z.
kuzyn(X,Y) :- plec(X,m),dziecko(X,Z),ciotka(Z,Y),X\==Y,X\==Z,Y=\=Z.
kuzyn(X,Y) :- plec(X,m),dziecko(X,Z),stryj(Z,Y),X\==Y,X\==Z,Y\==Z.
 
 
potomek(X,Y) :- rodzic(Y,X).  % rodzic(Y,X). to to samo co dziecko(X,Y).
potomek(X,Y) :- rodzic(Z,X),potomek(Z,Y).
 

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

krewny(X,Y) :- dziecko(X,Y);rodzic(X,Y);kuzyn(X,Y);babcia(X,Y);dziadek(X,Y),X\==Y.
 
liczba_przodkow(X,Z) :- findall(Y, przodek(X,Y), X1),counter(X1,Z).
 
counter([],0).
counter([_|T],N) :- counter(T,N1),N is N1+1.
 
matka3(tak,X,Y) :- matka(X,Y).
matka3(nie,X,Y) :- not(matka(X,Y)),matka(Z,Y),Z\==X.

matka3(brak_danych,X,Y) :- not(matka(X,Y)),not(matka(Z,Y)),Z\==X.

Podczas wpisywania przykładów, wyświetla się błąd : ==/2: Arithmetic: `monika/0' is not a function

0

W kilku miejscach masz operator =\= zamiast \==. Ten drugi jest ogólnym operatorem porównania. Pierwszy jest operatorem arytmetycznym, czyli próbuje traktować swoje argumenty jako wyrażenia arytmetyczne - najpierw obliczyć ich wartość, a dopiero potem porównać. Obliczenie wartości liczbowej wyrażenia monika się nie powiodło.

0

Raczej \= nie \== (chyba).

0

Operator \= sprawdza, czy lewą stronę da się uzgodnić z prawą (wynikiem jest true jeżeli się nie da). Operator \== tylko czy są różne. Jeżeli strony są już uzgodnione, to wynik będzie ten sam, jeżeli nie, to może być inny. Dokładnie się nie wczytywałem w kod, ale jeżeli w podanym rozwiązaniu operator używany jest tylko dla już uzgodnionych wartości to wystarczy \==.

1 użytkowników online, w tym zalogowanych: 0, gości: 1