X,Z,Y - ogólne obiekty, zmienne
anna, x,p,ona – konkretne obiekty
Bazę wiedzy tworzymy poprzez zapisywanie faktów w postaci: kobieta(anna).
mezczyzna(tomasz).
rodzic(jan, alicja).
%oznacza, że jan jest rodzicem alicji
%tak piszemy komentarz
Reguły:
dziecko(X,Y):-rodzic(Y,X).
%budujemy bardziej złożone reguły z istniejących już faktów/reguł
X\=Y oznacza, że zmienna X nie jest tożsama ze zmienną Y, np.
siostra(X,Y):-rodzic(Z,X),rodzic(Z,Y),kobieta(X),X\=Y
X jest siostrą Y, jeżeli Z jest rodzicem X i Y, Z jest kobietą i nie jest samą sobą Rekurencyjna definicja przodka:
przodka bezpośredniego możemy zdefiniować:
przodek(X,Y):-rodzic(X,Y). %matka jest przodkiem dziecka przodek pośredni, np. dziadek
przodek(X,Y):-rodzic(X,Z),przodek(Z,Y), np.
przodek(dziadek,syn) jeżeli rodzic(dziadek,ojciec) i przodek(ojciec,syn) dziadek
przecinek (,) stanowi koniunkcję, średnik (;) alternatywę, lecz można ją też zapisywać jako oddzielne reguły.
ojciec
syn
[element1, element2, element3] wtedy element 1 jest głową, a pozostałe tworzą ogon lub jawnie deklarować [element1 | [element2,element3]]
co odpowiada ogólnemu zapisowi [głowa|ogon].
W Prologu dostęp do list odbywa się rekurencyjnie, tzn. można dostać się jedynie do głowy listy, a następnie ogon znowu dzielony jest na głowę i ogon, np.
[a|[a,[b,c]]]
1) głowa a, zaś ogon [a, [b,c]]
2) głowa a, zaś nowy ogon to [b,c]
3) głowa b, zaś kolejny ogon to c
4) głowa to lista pusta [], koniec.
Można zapisywać również listy tak:
Hobby1=[muzyka, kuchnia].
Hobby2=[narty,taniec].
Lista=[plastyka,Hobby1,Hobby2,tenis]
czyli Lista=[plastyka,[muzyka,kuchnia],[narty,taniec],tenis]
czy jest członkiem listy?
X jest członkiem listy L, jeśli jest jej głową lub ogonem: memeber(X,[X|Tail]. %X jest głową
member(X,[Head|Tail]):-member(X,Tail)
Przykład na stosowanie operatorów = oraz is
?- X=1+2
odpowiedź: X=1+2
?- X is 1+2
odpowiedź: X=3
Przykład
Wyznaczyć długość listy termów. Długość listy:
1) równa się 0, jeśli lista jest pusta
2) równa się długości jej ogona powiększonej o 1, jeśli lista jest niepusta length([],0).
length([_|Tail],N):-length(Tail,N1), N is N1+1.
funktor write(‘wypisz cos w konsoli’)
funktor nl przenosi do nowej linii
Przykład
Wypisz całą listę, każdy element w nowej linii:
piszListe([]).
piszListe([G|O]):-write(G),nl,piszListe(O).
Oblicz długość listy:
długość(0,[]). % długość listy pustej jest równa zero długość(N,[G|O]):-dlugosc(N1,O), N is N1+1 % długość listy równa jest długości jej ogona +1
Sumuj elementy listy:
suma(0,[]). % suma listy pustej jest równa zero
suma(S,[G|O]):-suma(S1,O),S is S1+G % suma listy niepustej równa jest jej sumie głowy i kolejnego elementu z ogona - rekurencja
Oblicz średnią listy
srednia(S,L):-suma(Suma,L), długość(D,L), D>0, S is Suma/D.
Czy element jest członkiem listy?
członek_listy(E,[E,_]). %czyli w każdym wypadku jest członkiem, gdy jest głową listy członek_listy(E,[_,O]):-członek_listy(E,O). % jeśli nie jest głową, to wystarczy, że jest członkiem ogona Oblicz silnię:
silnia(N,W):- N>0, N1 is N-1, silnia(N1,W1), W is N*W1.
silnia(0,1).