wszystkie zadania

  1. Napisz w Prologu klauzule, obliczajaca pole kwadratu

pole_kw(A) :- write('Pole = '),X is A*A,write(X).

  1. Napisz w Prologu klauzule, obliczajaca pole koła

okrag(R) :- write('Pole='),P is 3.14*R*R,write(P).

  1. Napisz w Prologu klauzule, obliczajaca srednia arytmetyczna dwoch liczb

srednia(X,Y) :- Z is (X+Y)/2, write(Z).

  1. Dla nastepujacych faktow:

figura(kwadrat,4).

figura(trojkat,3).

figura(trapez,4).

figura(pieciokat_foremny,5).

figura(szczesciokat_foremny,6).

figura(osmiokat_foremny,8).

figura(dziesieciokat_foremny,10).

napisz klauzule, ktora wypisze tylko nazwy figur, ktore maja nie wiecej niz piec scian.

mn5(X) :- figura(X,Y),Y=<5.

  1. Załóżmy, że zapisano w formie klauzul Prologu następujące relacje:

ojciec(X,Y) /* X jest ojcem Y */

matka(X,Y) /* X jest matka Y */

mezczyzna(X) /* X jest mezczyzna */

kobieta(X) /* X jest kobieta */

rodzic(X,Y) /* X jest rodzicem Y */

diff(X,Y) /* X i Y sa rozne */

nalezy zapisac klauzule definiujace relacje:

jest_matka(X) /* X jest matka */

jest_ojcem(X) /* X jest ojcem */

jest_synem(X) /* X jest synem */

siostra(X,Y) /* X jest siostra Y */

dziadek(X,Y) /* X jest dziadkiem */

rodzenstwo(X,Y) /* X i Y sa rodzenstwem */

kobieta(anna).

kobieta(jola).

kobieta(maria).

kobieta(martyna).

mezczyzna(tomasz).

mezczyzna(jurek).

mezczyzna(jan).

mezczyzna(bartek).

mezczyzna(olaf).

rodzic(tomasz,maria).

rodzic(anna,jola).

rodzic(maria,jurek).

rodzic(maria,martyna).

rodzic(jan,jurek).

rodzic(jan,martyna).

rodzic(bartek,olaf).

ojciec(X,Y):- rodzic(X,Y),mezczyzna(X).

matka(X,Y):- rodzic(X,Y),kobieta(X).

diff(X,Y):- rodzic(X)\=rodzic(Y).

jest_matka(anna).

jest_matka(maria).

jest_ojcem(jan).

jest_ojcem(bartek).

jest_synem(jurek).

jest_synem(olaf).

siostra(X,Y):- kobieta(X),rodzic(Z,X),rodzic(Z,Y),X\=Y.

dziadek(X, Y):- mezczyzna(X),rodzic(X, Z),rodzic(Z, Y).

rodzenstwo(X,Y):-rodzic(Z,X),rodzic(Z,Y),X\=Y.

  1. % Znajdź ostatni element listy:

% ?- my_last(X,[a,b,c,d]).

% X = d

% last(?Elem, ?Lista) jest predefiniowane

my_last(X,[X]).

my_last(X,[_|L]) :- my_last(X,L).

  1. % Znajdź n-ty element listy:

% ?- element_at(X,[a,b,c,d,e],3).

% X = c

% nth1(?Index, ?List, ?Elem) jest predefiniowane

element_at(X,[X|_],1). % z listy X znajduje element pierwszy czyli glowe bo podana jest 1

element_at(X,[_|T],Y) :- Y > 1, Y1 is Y - 1, element_at(X,T,Y1).

  1. % Napisz klauzulę odwracającą list

% reverse(+List1, -List2) jest predefiniowane

% Odwrócić kolejność elementów w Lista1 i ujednolicić wynik elementów z List2.

reverse([],[]).

reverse([X|L],R):-

reverse(L,RL),

append(RL,[X],R).

  1. Napisz klauzulę stwierdzającą, czy elementy listy tworzą palindrom

palindrome(L):- reverse(L,L).

my_reverse([],[]).

my_reverse([H|T],R):- my_reverse(T,T1),append(T1,[H],R).

  1. % Największy wspólny dzielnik 2 liczb

% nwd(X,Y,N) :- X,Y to liczby N to NWD

nwd(X,0,X) :- X > 0.

nwd(X,Y,N) :- Y > 0, Z is X mod Y, gcd(Y,Z,N).

  1. Napisz predykat liczący silnię danej liczby

silnia(0,1):-!.

silnia(1,1):-!.

silnia(N,X):- M is N-1, silnia(M,Y), X is Y*N.

  1. Napisz predykat znajdujący maksymalna (minimalną) wartość w liście.

maximum([G],G).

maximum([G|O],Max):-maximum(O,Max1),

(G>=Max1, Max=G; G<Max1, Max=Max1). minimum([G],G).

minimum([G|O],Min):- minimum(O, Min1),

(G=<Min1, Min=G; G>Min1, Min=Min1).

  1. Zdefiniuj predykat liczący sumę wszystkich elementów listy

suma(L,Suma).

suma([G], G):-!.

suma([G|O], Suma):- suma(O,Y), Suma is Y+G.

  1. Jak wypisać jednym poleceniem wszystkie permutacje liczb 1-5 ? Użyj predykatu wbudowanego permutation.

Permutation([1,2,3,4,5], X).

  1. System dwójkowy:

cyfra(0).

cyfra(1).

liczba(X):-

cyfra(S),

cyfra(D),

cyfra(J),

X is 4*S+2*D+J,write(S),write(D),write(J).

  1. Wypisanie listy:

p([1,2,3]).

wypisz_liste([]).

wypisz_liste(Lista) :- Lista = [Glowa|Ogon], write(Glowa), nl, wypisz_liste(Ogon).

  1. %%% Prosty program ilustruj±cy ideę generacji/wyszukiwania rozwiazań w Prologu

% Fakty: definicja dostepnych cyfr.

cyfra(0).

cyfra(1).

cyfra(2).

cyfra(3).

cyfra(4).

cyfra(5).

cyfra(6).

cyfra(7).

cyfra(8).

cyfra(9).

% Przykładowa definicja liczby trzycyfrowej

liczba(X):-

cyfra(S),

cyfra(D),

cyfra(J),

X is 100*S+10*D+J.

% Przykład wypisywania liczb od 0 do 999.

write999 :-

liczba(X),

write(X),nl,

fail.

write999 :-

write('=====').

% Przykład wypisywania liczb z zadanego zakresu od A do Z

% Uwaga: przykład ma charakter logiczny; uzyta metoda nie jest efektywna

writeAZ(A,Z) :-

liczba(X),

X >= A,

X =< Z,

write(X), nl,

fail.

writeAZ(_,_) :-

write('=====').

% Modyfikacje:

% 1. Zmiana zakresu.

% 2. Zmiana kolejności.

% 3. Zmiana sposobu wypisywania.

% eof

  1. Zadanie logiczne:

% Fakty: definicja dostępnych cyfr.

cyfra(0).

cyfra(1).

cyfra(2).

cyfra(3).

cyfra(4).

cyfra(5).

cyfra(6).

cyfra(7).

cyfra(8).

cyfra(9).

% Skrót nazwy predykatu cyfra/1.

c(X) :- cyfra(X).

% Rozwiązanie dla problemu SEND + MORE = MONEY

solve :-

c(S),c(E), c(N), c(D), c(M), c(O), c(R), c(Y), M > 0,

S \= E, S \= N, S \= D, S \= M, S \= O, S \= R, S \= Y,

E \= N, E \= D, E \= M, E \= O, E \= R, E \= Y,

N \= D, N \= M, N \= O, N \= R, N \= Y,

D \= M, D \= O, D \= R, D \= Y,

M \= O, M \= R, M \= Y,

O \= R, O \= Y,

R \= Y,

L1 is S*1000 + E*100 + N*10 + D,

L2 is M*1000 + O*100 + R*10 + E,

L3 is M*10000 + O*1000 + N*100 + E*10 + Y,

Q is (L1 + L2) - L3, % write(Q),nl,

Q = 0,

write(' '),write(S),write(E),write(N),write(D),nl,

write('+'),write(M),write(O),write(R),write(E),nl,

write(M),write(O),write(N),write(E),write(Y).

Napisz program w języki Prolog rozwiązujący następujący kryptogram:


$$\frac{\begin{matrix} \mathbf{\text{\ \ \ \ \ \ \ \ \ \ \ \ G\ \ R\ \ A\ \ D}} \\ \mathbf{+ D\ \ E\ \ S\ \ Z\ \ C\ \ Z} \\ \end{matrix}}{\mathbf{\text{\ \ \ \ S\ \ T\ \ R\ \ A\ \ T\ \ A}}}$$

Rozwiązanie:


$$\frac{\begin{matrix} \mathbf{\ \ \ \ \ \ \ \ 8475} \\ \mathbf{+ 596232} \\ \end{matrix}}{\mathbf{\ \ \ \ 604707}}$$

cyfra(0).

cyfra(1).

cyfra(2).

cyfra(3).

cyfra(4).

cyfra(5).

cyfra(6).

cyfra(7).

cyfra(8).

cyfra(9).

c(X) :- cyfra(X).

solve :-

c(G),c(R), c(A), c(D), c(E), c(S), c(Z), c(C), c(T), E > 0,

G \= R, G \= A, G \= D, G \= E, G \= S, G \= Z, G \= C, G \= T,

R \= A, R \= D, R \= E, R \= S, R \= Z, R \= C, R \= T,

A \= D, A \= E, A \= S, A \= Z, A \= C, A \= T,

D \= E, D \= S, D \= Z, D \= C, D \= T,

E \= S, E \= Z, E \= C, E \= T,

S \= Z, S \= C, S \= T,

Z \= C, Z \= T,

C \= T,

L1 is G*1000 + R*100 + A*10 + D,

L2 is D*100000 + E*10000 + S*1000 + Z*100 + C*10 + Z,

L3 is S*100000 + T*10000 + R*1000 + A*100 + T*10 + A,

Q is (L1 + L2) - L3, % write(Q),nl,

Q = 0,

write(' '),write(G),write(R),write(A),write(D),nl,

write('+'),write(D),write(E),write(S),write(Z),write(C),write(Z),nl,

write(S),write(T),write(R),write(A),write(T),write(A).

  1. W pewnym lesie mieszka lew i nosorożec, Lew kłamie w poniedziałki, wtorki, środy,
    w pozostałe dni mówi prawdę, nosorożec kłamie w czwartki, piątki i soboty w pozostałe dni mówi prawdę.

Na pytanie jaki był wczoraj dzień odpowiedzieli:

Lew: wczoraj był jeden z dni w które kłamię,

Nosorożec: wczoraj był jeden z dni w których ja również kłamię.

Jaki to był dzień ?

Odp: Czwartek

http://www.im.pwr.wroc.pl/~przemko/prolog/blog-3/files/e515007a77e7462376fe0c3622917e9f-1.html

klamie(lew,pon).

klamie(lew,wtorek).

klamie(lew,sroda).

klamie(nosorozec,czwartek).

klamie(nosorozec,piatek).

klamie(nosorozec,sobota).

wczoraj(niedziela,sobota).

wczoraj(pon,niedziela).

wczoraj(wtorek,pon).

wczoraj(sroda,wtorek).

wczoraj(czwartek,sroda).

wczoraj(piatek,czwartek).

wczoraj(sobota,piatek).

wczoraj_klamie(Kto,Wczoraj):-

klamie(Kto,Wczoraj),

wczoraj(Dzis,Wczoraj),

not(klamie(Kto,Dzis)).

wczoraj_klamie(Kto,Wczoraj):-

klamie(Kto,Dzis),

wczoraj(Dzis,Wczoraj),

not(klamie(Kto,Wczoraj)).

jaki_dzien(Wczoraj):-

wczoraj_klamie(lew,Wczoraj),

wczoraj_klamie(nosorozec,Wczoraj).

  1. Napisz program w prologu, który rozwiązuje układ równań:

http://www-users.mat.umk.pl/~fly/materialy/pl/referaty/CLP_rosi.pdf


y = 2x2 − 5x − 9


y = −x2 + 8x + 2

Jako dziedzinę wartości argumentów przyjmij przedział z zakresu (-1000,1000)

  1. Napisz program w prologu, który generuje listę n-elementową wartości będących liczbami pierwszymi,

for(I, Start, Finish):-

Start > Finish, !, fail;

I is Start;

for(I, Start + 1, Finish).

isPrime(N):-

for(I, 2, N - 1),

0 is N mod I, !, fail;

!.

allPrimes(Start, Finish):-

for(I, Start, Finish),

isPrime(I), write(I), write(' '), fail.

  1. Napisz program w prologu, który oblicza sumę iloczynów wartości całkowitych umieszczonych na dwóch listach,

il1([],1) :- !.

il1([H|T],W1) :- il1(T,WX), W1 is WX*H.

il1([],0).

il2([],1) :- !.

il2([H2|T2],W2):- il2(T2,WY),W2 is WY*H2 .

il2([],0).

zad([],[],0).

zad([G1|O1],[G2|O2],S) :- il1([G1|O1],X1), il2([G2|O2],X2), S is X1+X2.

  1. Napisz program w prologu, który symuluje zachowanie półsumatora jednobitowego,

and(0,0,0).

and(0,1,0).

and(1,0,0).

and(1,1,1).

xor(0,0,0).

xor(0,1,1).

xor(1,0,1).

xor(1,1,0).

zad(A,B,P,S) :- and(A,B,P), xor(A,B,S).

  1. Napisz program w prologu, który symuluje działanie multipleksera o dwóch wejściach adresowych,

not(1,0).

not(0,1).

and(1,1,1).

and(1,0,0).

and(0,1,0).

and(0,0,0).

or(1,1,1).

or(1,0,1).

or(0,1,1).

or(0,0,0).

zad(A,B,Y) :-not(A,NA), not(B,NB), and(A,B,W1), and(A,NB,W2), and(NA,B,W3), and(NA,NB,W4), or(W1,W2,WO1), or(WO1,W3,WO2), or(WO2,W4,Y).

  1. Napisz program w prologu, który symuluje działanie demultipleksera o dwóch wejściach adresowych,

  2. Za pomocą język prolog, zweryfikuj czy funkcja logiczna:

A + !B*C !C+B*A

jest tautologią,

not(1,0).

not(0,1).

and(0,0,0).

and(0,1,0).

and(1,0,0).

and(1,1,1).

or(0,0,0).

or(0,1,1).

or(1,0,1).

or(1,1,1).

eq(1,0,0).

eq(0,1,0).

eq(1,1,1).

eq(0,0,1).

zad(A,B,C,Y):- not(B,NB), not(C,NC), and(A,NB,W1), or(W1,C,W3), and(NC,B,W2),or(W2,A,W4), eq(W3,W4,Y).

  1. Zweryfikuj czy prawo pochłaniania jest tautologią.

and(0,0,0).

and(0,1,0).

and(1,0,0).

and(1,1,1).

or(0,0,0).

or(0,1,1).

or(1,0,1).

or(1,1,1).

st(1,0,0).

st(1,1,1).

st(0,1,1).

st(0,0,1).

pr1(P,Q,Y) :- or(P,Q,W1), st(P,W1,Y).

pr2(P,Q,Y) :- and(P,Q,W1), st(W1,P,Y).

  1. W pewnym lesie mieszka lew i nosorożec, lew kłamie we wtorek, środę i czwartek

w pozostałe dni mówi prawdę, nosorożec kłamie w piątek, sobotę i niedzielę w pozostałe dni

mówi prawdę. Na pytanie jaki był wczoraj dzień tygodnia odpowiedzieli:

Lew: wczoraj był jeden z dni w które kłamię,

Nosorożec: wczoraj był jeden z dni w których ja również kłamię.

Jaki był wczoraj dzień ?

Napisz predykat, który rozwiązuje podane zadania, wypisując odpowiedni dzień tygodnia.

  1. Napisz regułę symulującą działania multipleksera o czterech wejściach binarnych i jednym

wyjściu. W wyniku działania reguły, na wyjścia powinna zostać zwrócona wartość

odpowiedniego wejścia wynikająca z ustawionych bitów adresu.

not(1,0).

not(0,1).

nand(1,0,1).

nand(0,1,1).

nand(1,1,0).

nand(0,0,1).

multipleks(A,B,D0,D1,D2,D3,X):- not(A,G),

not(B,H),

not(H,I),

not(G,J),

nand(D0,H,C),

nand(D1,H,D),

nand(D2,I,E),

nand(D3,I,F),

nand(C,E,K),

nand(D,F,L),

nand(K,G,M),

nand(L,J,N),

nand(M,N,X).

qqq:- A is 0; A is 1, B is 0; B is 1, D0 is 0; D0 is 1, D1 is 0; D1 is 1, D2 is 0; D2 is 1, D3 is 0; D3 is 1.


Wyszukiwarka