Obiekty

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

Listy

[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.

Funktory w Prologu:

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).