materialy wyklad 3 4


Program w2_3
% Program prezentujacy dzialanie predykatow standardowych "fail" i "!" (cut)
predicates
program
nondeterm wykonaj(Integer)
nondeterm wykonaj_dalej(Integer)
goal
program.
clauses
% wstawiamy w rozne miejsca kodu << !,write(" ! ") >> i testujemy dzialanie programu
program:-
wykonaj(X),write(" ",X," "),
wykonaj(Y),write(" ",Y," "),
write(" <- "),fail.
program.
wykonaj(0).
wykonaj(1).
wykonaj(X):-wykonaj_dalej(X).
wykonaj_dalej(2).
wykonaj_dalej(3).
Program w3_0
% Porownywanie i przypisywanie wartosci zmiennym
predicates
program
goal
program.
clauses
program:-
X = 0,
Y = 1,
write("X=",X," Y=",Y),nl.
Po kolei próbujemy następujących reguł dla predykatu program:
(1)
program:-
X = 0,
Y = 1,
Y = X,
write("X=",X," Y=",Y),nl.
(2)
program:-
X = 0,
Y = X+1,
write("X=",X," Y=",Y),nl.
(3)
program:-
X = 0,
Y = 1,
X = Y-1,
write("X=",X," Y=",Y),nl.
(4)
program:-
X = 0,
X = Y-1,
write("X=",X," Y=",Y),nl.
Program w3_1
% Drzewo dynastyczne Jagiellonow z rekurencja
predicates
nondeterm mezczyzna(String)
nondeterm kobieta(String)
nondeterm ojciec(String,String) % ojciec(Ojciec,Dziecko)
nondeterm matka(String,String) % matka(Matka,Dziecko)
nondeterm rodzic(String,String) % rodzic(Rodzic,Dziecko)
nondeterm dziecko(String,String) % dziecko(Dziecko,Rodzic)
nondeterm dziadek(String,String) % dziadek(Dziadek,Wnuk)
nondeterm babcia(String,String) % babcia(Babcia,Wnuk)
nondeterm wnuk(String,String,String) % wnuk(Wnuk,Dziadek,Babcia)
nondeterm prawnuk(String,String,String)% prawnuk(Prawnuk,Pradziadek,Prababcia)
nondeterm bezdzietny(String)
nondeterm osoba(String)
nondeterm dwoch_synow(String) % dwoch_synow(Rodzic)
nondeterm potomek(String,String) % potomek(Potomek,Przodek)
goal
% wnuk(Wnuk,"Wladyslaw Jagiello",Babcia).
% wnuk(Wnuk,"Wladyslaw Jagiello",_).
% prawnuk(Prawnuk,Pradziadek,Prababcia).
% bezdzietny(Osoba).
% osoba(Osoba),
% dwoch_synow(Osoba).
potomek(Kto,"Wladyslaw Jagiello").
% potomek("Zygmunt August",Kogo).
clauses
% fakty
mezczyzna("Wladyslaw Jagiello").
mezczyzna("Wladyslaw Warnenczyk").
mezczyzna("Kazimierz Jagiellonczyk").
mezczyzna("Jan Olbracht").
mezczyzna("Aleksander Jagiellonczyk").
mezczyzna("Zygmunt I Stary").
mezczyzna("Zygmunt August").
kobieta("Zofia Holszanska").
kobieta("Elzbieta Habsburg").
kobieta("Bona Sforza").
ojciec("Wladyslaw Jagiello","Wladyslaw Warnenczyk").
ojciec("Wladyslaw Jagiello","Kazimierz Jagiellonczyk").
ojciec("Kazimierz Jagiellonczyk","Jan Olbracht").
ojciec("Kazimierz Jagiellonczyk","Aleksander Jagiellonczyk").
ojciec("Kazimierz Jagiellonczyk","Zygmunt I Stary").
ojciec("Zygmunt I Stary","Zygmunt August").
matka("Zofia Holszanska","Wladyslaw Warnenczyk").
matka("Zofia Holszanska","Kazimierz Jagiellonczyk").
matka("Elzbieta Habsburg","Jan Olbracht").
matka("Elzbieta Habsburg","Aleksander Jagiellonczyk").
matka("Elzbieta Habsburg","Zygmunt I Stary").
matka("Bona Sforza","Zygmunt August").
% reguly
rodzic(Rodzic,Dziecko):- % rodzicem jest ojciec lub matka
ojciec(Rodzic,Dziecko).
rodzic(Rodzic,Dziecko):-
matka(Rodzic,Dziecko).
dziecko(Dziecko,Rodzic):- % dziecko jest dzieckiem ojca lub matki
ojciec(Rodzic,Dziecko). % zamiast tej alternatywy mozna
dziecko(Dziecko,Rodzic):- % wykorzystac predykat rodzic
matka(Rodzic,Dziecko).
dziadek(Dziadek,Wnuk):- % dziadkiem jest ojciec rodzica
ojciec(Dziadek,Rodzic),rodzic(Rodzic,Wnuk).
babcia(Babcia,Wnuk):- % babcia jest matka rodzica
matka(Babcia,Rodzic),rodzic(Rodzic,Wnuk).
wnuk(Wnuk,Dziadek,Babcia):- % wnuk ma babcie i dziadka
dziadek(Dziadek,Wnuk),babcia(Babcia,Wnuk).
% reguly na wykladzie
prawnuk(Prawnuk,Pradziadek,Prababcia):- % prawnuk to dziecko wnuka
dziecko(Prawnuk,Wnuk),wnuk(Wnuk,Pradziadek,Prababcia).
bezdzietny(Osoba):-
osoba(Osoba), % klauzula pomocnicza dla ustalenia zmiennej Osoba
not(rodzic(Osoba,_)). % bez niej not(.) nie zadziala
osoba(Osoba):-
mezczyzna(Osoba);kobieta(Osoba). % alternatywny zapis alternatywy (unikamy!)
dwoch_synow(Osoba):- % rodzic ma co najmniej dwoch synow
rodzic(Osoba,X), % jesli w bazie faktow
mezczyzna(X), % sa co najmniej dwie klauzule rodzic(.,.),
rodzic(Osoba,Y), % w ktorych pierwsza zmienna jest taka sama
mezczyzna(Y), % a druga jest rozna
X <> Y,!.
potomek(Potomek,Przodek) :- % potomkiem jest dziecko
dziecko(Potomek,Przodek).
potomek(Potomek,Przodek) :- % potomkiem jest dziecko potomka
dziecko(Potomek,X),
potomek(X,Przodek).
Po kolei próbujemy następujących celów (goal):
(1)
dwoch_synow(Osoba).
(2)
osoba(Osoba),
dwoch_synow(Osoba).
(3)
potomek(Kto,"Wladyslaw Jagiello").
(4)
potomek("Zygmunt August",Kogo).
Program w3_2
% Regula rekurencyjna: droga od... do...
predicates
nondeterm droga(symbol,symbol)
nondeterm mozna_dojsc(symbol,symbol)
clauses
%fakty
droga(a,b). droga(a,c). droga(b,c). droga(b,e).
droga(b,d). droga(c,d). droga(d,e).
%reguly
mozna_dojsc(X,X). % mozna_dojsc(X,Y):-X=Y.
mozna_dojsc(X,Y):-
droga(Z,Y),
mozna_dojsc(X,Z),write(Z," ").
goal
mozna_dojsc(a,e). %,nl,fail.
Po kolei testujem cele:
(1)
mozna_dojsc(a,e).
(2)
mozna_dojsc(a,e),nl,fail.
(3)
mozna_dojsc(e,a).
Program w3_3
% Rekurencja ogonowa i nieogonowa,
% oszczedzajaca stos i nieoszczedzajaca stosu
predicates
nondeterm inkrementuj_1(Long)
nondeterm inkrementuj_2(Long)
nondeterm inkrementuj_3(Long)
nondeterm inkrementuj_4(Long)
nondeterm sprawdz(Long)
clauses
inkrementuj_1(N):-
write(N),nl,
NoweN = N+1,
inkrementuj_1(NoweN).
inkrementuj_2(N):-
write(N),nl,
NoweN = N+1,
inkrementuj_2(NoweN),
nl.
inkrementuj_3(N):-
write(N),nl,
NoweN = N+1, % !,
inkrementuj_3(NoweN).
inkrementuj_3(_):- write("Tu nigdy nie wejdziemy").
inkrementuj_4(N):-
write(N),nl,
NoweN = N+1,
sprawdz(NoweN), % !,
inkrementuj_4(NoweN).
sprawdz(M):-
M>=100000,
write("Szesciocyfrowa liczba"),nl,
true.
sprawdz(M):-
M>=10000,
write("Pieciocyfrowa liczba"),nl,
true.
sprawdz(M):-
M>=1000,
write("Czterocyfrowa liczba"),nl,
true.
sprawdz(M):-
M>=100,
write("Trzycyfrowa liczba"),nl,
true.
sprawdz(M):-
M>=10,
write("Dwucyfrowa liczba"),nl,
true.
sprawdz(M):-
M<10.
goal
inkrementuj_1(1).
% inkrementuj_2(1).
% inkrementuj_3(1).
% inkrementuj_4(1).
Po kolei wywolujemy rozne reguly inkrementuj. Nastepnie wstawiamy cut-a w oznaczone miejsca
i ponownie testujemy inkrementuj_2 i inkrementuj_3.
Program w3_4
% Rekurencyjne obliczanie potegi X^Y
predicates
nondeterm potega(Integer,Integer)
nondeterm potega1(Integer,Integer,Integer)
nondeterm potega2(Integer,Integer,Integer)
nondeterm potega3(Integer,Integer,Integer,Integer)
goal
potega(2,3).
clauses
potega(X,Y):- potega1(X,Y,1).
% potega(X,Y):- potega2(X,Y,W),write("Wynik = ",W),nl.
% potega(X,Y):- potega3(X,Y,W,1),write("Wynik = ",W),nl.
potega1(_,0,W):-write("Wynik = ",W),nl.
potega1(X,N,W):-
NW = W*X,
NN = N-1,
potega1(X,NN,NW).
potega2(_,0,1).
potega2(X,N,W):-
NN = N-1,
potega2(X,NN,NW),
W = NW*X.
potega3(_,0,W,W).
potega3(X,N,W,Ak):-
NAk = Ak*X,
NN = N-1,
potega3(X,NN,W,NAk).
Po kolei próbujemy następujących reguł dla predykatu potega(.,.):
(1)
potega(X,Y):- potega1(X,Y,1).
(2)
potega(X,Y):- potega2(X,Y,W),write("Wynik = ",W),nl.
(3)
potega(X,Y):- potega3(X,Y,W,1),write("Wynik = ",W),nl.
Program w3_5
% Sprawdzenie czy dana liczba jest liczba pierwsza
predicates
nondeterm pierwsza(Integer)
nondeterm pierwsza(Integer,Integer)
goal
pierwsza(13).
clauses
pierwsza(X):-
pierwsza(X,2),
write(X," jest liczba pierwsza"),nl.
pierwsza(X):-
write(X," nie jest liczba pierwsza"),nl.
pierwsza(X,X).
pierwsza(X,N):-
(X mod N)><0,
NN = N+1,
pierwsza(X,NN).
Program w4_1
% Sprawdzanie parzystosci liczby
% za pomoca modulo lub w petli rekurencji
predicates
nondeterm program
sprawdz_klasycznie(Integer,String)
nondeterm sprawdz_rekurencyjnie(Integer,String)
nondeterm zamien(String,String)
goal
program.
clauses
program:-
write("Podaj liczbe: "),
readint(L),
sprawdz_klasycznie(L,Parzystosc),
write("Liczba ",L," jest ",Parzystosc),nl,
sprawdz_rekurencyjnie(L,Parzystosc_r),
write("Liczba ",L," jest ",Parzystosc_r),nl.
sprawdz_klasycznie(L,"parzysta"):-
L mod 2 = 0,!.
sprawdz_klasycznie(_,"nieparzysta").
sprawdz_rekurencyjnie(0,"parzysta"):-!.
sprawdz_rekurencyjnie(L,P):-
NL = L-1,
sprawdz_rekurencyjnie(NL,NP),
zamien(P,NP).
zamien("parzysta","nieparzysta").
zamien("nieparzysta","parzysta").
Program w4_2
% Calkowanie numeryczne metoda Monte Carlo 1 i 2
constants
a = 0 % przedzial calkowania
b = 1
ymax = 1 % wys. prostokata w ktorym zawiera sie calkowana funkcja
lp = 10000 % liczba losowanych punktow
predicates
nondeterm funkcja(Real,Real)
nondeterm montecarlo1(Integer,Integer)
nondeterm montecarlo2(Integer,Integer)
nondeterm sprawdz(Real,Real,Integer,Integer)
clauses
funkcja(X,Y):- Y = X*X.
montecarlo1(0,S):-
C = S/lp,
write("Calka obliczona metoda 1 wynosi ",C),nl.
montecarlo1(N,S):-
random(L),
X = a+L*(b-a),
funkcja(X,Y),
NS = S+Y,
NN = N-1,
montecarlo1(NN,NS).
montecarlo2(0,S):-
C = (b-a)*ymax*S/lp,
write("Calka obliczona metoda 2 wynosi ",C),nl.
montecarlo2(N,S):-
random(Lx),
X = a+Lx*(b-a),
random(Ly),
Y = Ly*ymax,
sprawdz(X,Y,S,NS),
NN = N-1,
montecarlo2(NN,NS).
sprawdz(X,Y,S,S):-
funkcja(X,Yx),
Yx < Y,!.
sprawdz(_,_,S,NS):-
NS = S+1.
goal
montecarlo1(lp,0),
montecarlo2(lp,0).
Program w4_3
% Wyszukiwanie trojek liczb calkowitych A,B,C
% spelniajacych Twierdzenie Pitagorasa
predicates
nondeterm pitagoras
nondeterm pitagoras(Integer,Integer,Integer)
sprawdz(Integer,Integer,Integer)
clauses
pitagoras:- pitagoras(1,1,2).
pitagoras(_,_,C):-
C > 20, % zakres
nl,write("To juz wszystkie rozwiazania"),nl,nl.
pitagoras(A,B,C):-
sprawdz(A,B,C),
NA = A + 1,
NA <= B, %!,
pitagoras(NA,B,C).
pitagoras(A,B,C):-
sprawdz(A,B,C),
NB = B + 1,
NB < C, %!,
pitagoras(1,NB,C).
pitagoras(A,B,C):-
sprawdz(A,B,C),
NC = C + 1, %!,
pitagoras(1,1,NC).
sprawdz(A,B,C):-
A*A + B*B = C*C,!,
write("Rozwiazanie: A = ",A," B = ",B," C = ",C),nl.
sprawdz(_,_,_).
goal
pitagoras.
Testujemy program dla zakresu 20 oraz 100, następnie wstawiamy cut-a w zaznaczone miejsca.
Program w4_4
% Sprawdzenie czy dana liczba jest liczba pierwsza
% powtarzanie za pomoca rekurencji
predicates
nondeterm pierwsza(Integer)
nondeterm pierwsza(Integer,Integer)
nondeterm kontynuuj(Char)
nondeterm program.
goal
program.
clauses
program:-
write("Podaj liczbe: "),
readint(X),
pierwsza(X),
write("Kontynuowac? (y/n) "),
readchar(C),
nl,nl,
kontynuuj(C).
pierwsza(X):-
pierwsza(X,2),!,
write(X," jest liczba pierwsza"),nl.
pierwsza(X):-
write(X," nie jest liczba pierwsza"),nl.
pierwsza(X,X):-!.
pierwsza(X,N):-
(X mod N)><0,
NN = N+1,
pierwsza(X,NN).
kontynuuj('y'):-program.
kontynuuj(_).
Jest to rozwinięcie programu w3_5.
Program w4_5
% Sprawdzenie czy dana liczba jest liczba pierwsza
% powtarzanie za pomoca powtorz
predicates
nondeterm pierwsza(Integer)
nondeterm pierwsza(Integer,Integer)
kontynuuj(Char)
nondeterm powtorz
nondeterm program.
goal
program.
clauses
program:-
powtorz,
write("Podaj liczbe: "),
readint(X),
pierwsza(X),
write("Kontynuowac? (y/n) "),
readchar(C),
nl,nl,
kontynuuj(C).
pierwsza(X):-
pierwsza(X,2),!,
write(X," jest liczba pierwsza"),nl.
pierwsza(X):-
write(X," nie jest liczba pierwsza"),nl.
pierwsza(X,X):-!.
pierwsza(X,N):-
(X mod N)><0,
NN = N+1,
pierwsza(X,NN).
kontynuuj('y'):-!,fail.
kontynuuj(_).
powtorz.
powtorz:-powtorz.
Jest to rozwinięcie programu w3_5, inny sposób niż w programie w4_4.


Wyszukiwarka

Podobne podstrony:
15 Język Instruction List Układy sekwencyjne Działania na liczbach materiały wykładowe
Wytrzymałość materiałów wykład 6
Materiały z wykladu
wytrzymałość materiałów wykład 2
EPS materialy wyklad cz1
Wytrzymalosc Materialow wyklad B Graficzne obliczanie?lek z iloczynu 2 funkcji 07 8
Materialoznawstwo Wyklad3 WlasnosciEnergetyczne
Wytrzymalosc Materialow wyklad Laczniki 08 9
Materiały z wykładów
Wytrzymalosc Materialow wyklad Zakrzywione prety silnie 08 9
Wytrzymalosc Materialow wyklad?lki wielokrotne i zlozone 08 9
Wytrzymalosc Materialow wyklad Ciegna 08 9

więcej podobnych podstron