Advertisement
Guest User

powtorkaPrzedKolosem

a guest
Jan 19th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 4.61 KB | None | 0 0
  1. % Author: Maciej Żelazo
  2. % Date: 19.01.2019
  3.  
  4. %  Na kolokwium beda 3 lub 4 zadania z Prologa. Jedno z reukrencji
  5. %  wykorzystywanej w problemach znajdywania przechodnich zaleznosci
  6. %  miedzy faktami (np. wieksze owoce, rodzina, zaleznosci sluzbowe,
  7. %  dynastie, grafy, rejsy). Kolejne bedzie z operacji na wektorach/macierzach.
  8. %  Nastepne - analiza danych
  9. %  Ewentualnie czwarta grupa - prosta zagadka logiczna
  10.  
  11. %  Zad1 (analiza danych)
  12. %  Dla podanych faktow:
  13.  
  14. hobby(ania,[kino,narty]).
  15. hobby(jola,[kino,balet,boks]).
  16. hobby(tomek,[narty,boks,karate,basen]).
  17.  
  18. % a) wykonaj zapytanie, ktore wskaze osoby, ktore maja mniej niz 3 hobby
  19. % ?- hobby(I,Z), length(Z,Dlugosc), Dlugosc < 3.
  20.  
  21. % b) wykonaj regule, ktora dla podanej osoby obliczy punkty - za kazde hobby 5 punktow
  22.  
  23. liczpunkty(Imie,Punkty) :- hobby(Imie,ListaHobby), length(ListaHobby,Ilosc), Punkty is Ilosc*5.
  24. % ?- liczpunkty(ania,X).
  25.  
  26.  
  27. % c) wykonaj regule, ktora wskaze osoby majace podane hobby
  28.  
  29. ktoTeHobby(Hobby,Imie) :- hobby(Imie, ListaHobby), member(Hobby,ListaHobby).
  30. % ktoTeHobby(kino, X).
  31.  
  32. % d) wykonaj regule, ktora wypisze dla podanej osoby wszystkie jej hobby w osobnych liniach
  33.  
  34. piszliste([]).
  35. piszliste([Imie|ListaHobby]) :- write(Imie), nl, piszliste(ListaHobby).
  36. jakieHobby(Osoba) :- hobby(Osoba,Lista), piszliste(Lista).
  37. % ?- jakieHobby(ania).
  38.  
  39. % Zad. 2 (operacje na wektorach/macierzach)
  40. % Zdefiniuj predykat potega, ktory dal podanej listy wejsciowej zwraca
  41. % liste, ktorej elementy stanowia kwadrat
  42. % listy wejsciowej. % ?- potega([2,4,5],X). --> X = [4,16,25]
  43.  
  44. potega([],[]).
  45. potega([G1|O1],[G2|O2]) :- potega(O1,O2), G2 is G1^2.
  46. %?- potega([2,5,6],X).
  47.  
  48. % Zad. 3 Podaj ile razy wystepuje na liscie podany element
  49. % np. ?- ile([2,4,7,2,5,2],2,X). --> X = 3
  50.  
  51. ile([],_,0).
  52. ile([G|O],G,Wynik) :- ile(O,G,Wynik2),Wynik is Wynik2 + 1,!.    %glowa jest rowna liczbie ktora szukam wtedy licznik zwiekszam
  53. ile([_|O],G,Wynik) :- ile(O,G,Wynik).%
  54. %?- ile([2,5,4,2,5],2,X).
  55.  
  56. % Zad. 4 Utworz N-elementowa liste z kwadratami liczb naturalnych
  57. % z przedzialu <1,N>.
  58. %   ?- kwadraty(3,Wektor).   --> Wektor = [1,4,9]
  59. %   ?- kwadraty(5,Wektor).   --> Wektor = [1,4,9,16,25]
  60.  
  61. kwadraty(0,[]) :- !. %alternatywnie kwadraty(1,[1]) :-!>
  62. kwadraty(N,Lista) :-
  63.                   N1 is N-1,
  64.                   X is N*N,
  65.                   kwadraty(N1,Y),
  66.                   append(Y,[X],Lista).
  67. % ?- kwadraty(4,Wektor).
  68.  
  69. %rozwiazanie II
  70. kwadratyNew(X,Wektor) :-
  71.                      numlist(1,X,Lista),
  72.                       potega(Lista,Wektor).
  73. % kwadratyNew(4,Wektor).
  74.  
  75. %Zad. 5
  76. % Napisz program, ktory porownuje dwa wektory i zwraca trzeci wektor,
  77. % ktory zawiera mniejsze lub rowne
  78. % elementy na odpowiednich pozycjach w porownywalnych wektorach
  79. % ?- mniejsze([1,2,3],[5,2,0],Wynik). --> Wynik = [1,2,0]
  80.  
  81. mniejsze([],[],[]).
  82. mniejsze([G1|O1],[G2|O2],[G3|O3]) :-
  83.                                   (G2 >= G1, G3 is G1),
  84.                                   mniejsze(O1,O2,O3).
  85. mniejsze([G1|O1],[G2|O2],[G3,O3]) :-
  86.                                   (G2 < G1, G3 is G2),
  87.                                   mniejsze(O1,O2,O3).
  88.  
  89. %Zad. 6
  90. %      tytul wykonawcy czas w sekundach
  91. piosenka('Signs of Life',   [gilmour,ezrin],265).
  92. piosenka('Learning to Fly', [gilmour,moore, ezrin, carin], 293).
  93. piosenka('The Dogs of War', [gilmour,moore], 371).
  94.  
  95. % a) Stworz regule, ktora pozwoli dla podanego wykonawcy podac
  96. % tytuly jego utworow ?- tytul(moore,Tytul).
  97.  
  98. tytul(Wykonawca,TytulPiosenki) :-
  99.                                  piosenka(TytulPiosenki,ListaWykonawcow,_),
  100.                                  member(Wykonawca,ListaWykonawcow).
  101.                                  
  102. % ?- tytul(moore,Tytul).
  103.  
  104. % Stworz regule, ktora dla podanego tytulu zwroci
  105. % czas wykonania podzieloneg przez liczbe wykonawcow
  106. % ?- czas('Signs of Life',X). --> X = 132.5.
  107.  
  108. czas(TytulPiosenki,CzasSr) :-
  109.                               piosenka(TytulPiosenki,Lista,Czas),
  110.                               length(Lista,Wykonawcy),
  111.                               CzasSr is Czas/Wykonawcy.
  112. %?- czas('Signs of Life',X).
  113.                              
  114. % c) Napisz regule, ktora dla podanego tytulu wyswietli jego wykonawcow
  115. % w osobnych liniach, ale w odwrotnej kolejnosci niz sa na liscie
  116.  
  117.  
  118. piszlistep([X|ListaPiosenek]) :- write(X), nl, piszlistep(ListaPiosenek).
  119. wyswietlwykonawcow(TytulPiosenki) :-
  120.                                     piosenka(TytulPiosenki,Lista,_),
  121.                                     reverse(Lista,ListaReversed),   %Odwrocona liste trzeba zapisac do nowej zmiennej!
  122.                                     piszlistep(ListaReversed).
  123. %  ?- wyswietlwykonawcow('Learning to Fly').
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement