Všechna řešení, stromy, grafy Všechna řešení % z(Jmeno,Prijmeni,Sex,Vek,Prace,Firma) z(petr,novak,m,30,skladnik,skoda). z(pavel,novy,m,40,mechanik,skoda). z(rostislav,lucensky,m,50,technik,skoda). z(alena,vesela,z,25,sekretarka,skoda). z(jana,dankova,z,35,asistentka,skoda). z(lenka,merinska,z,35,ucetni,skoda). z(roman,maly,m,35,manazer,cs). z(alena,novotna,z,40,ucitelka,zs_stara). z(david,novy,z,30,ucitel,zs_stara). z(petra,spickova,z,45,reditelka,zs_stara). Najděte jméno a příjmení všech lidí. ?- findall(Jmeno-Prijmeni, z(Jmeno,Prijmeni,_,_,_,_),L). ?- bagof( Jmeno-Prijmeni, [S,V,Pr,F] ^ z(Jmeno,Prijmeni,S,V,Pr,F) , L ). ?- bagof( Jmeno-Prijmeni, [V,Pr,F] ^ z(Jmeno,Prijmeni,S,V,Pr,F) , L ). Najděte jméno a příjmení všech zamestnanců firmy skoda a cs ?- findall( c(J,P,Firma), ( z(J,P,_,_,_,Firma), ( Firma=skoda ; Firma=cs ) ), L ?- bagof( J-P, [P,S,V,Pr]^(z(J,P,S,V,Pr,F),( F=skoda ; F=cs ) ) , L ). ?- setof( P-J, [P,S,V,Pr]^(z(J,P,S,V,Pr,F),( F=skoda ; F=cs ) ) , L ). Hana Rudová, Logické programování I, 17. května 2007 2 Všechna řešení, stromy, grafy Všechna řešení: příklady 1. Jaká jsou příjmení všech žen? 2. Kteří lidé mají více než 30 roků? Nalezněte jejich jméno a příjmení. 3. Nalezněte abecedně seřazený seznam všech lidí. 4. Nalezněte příjmení učitelů ze zs_stara. 5. Jsou v databázi dva bratři (mají stejné příjmení a různá jména)? 6. Které firmy v databázi mají více než jednoho zaměstnance? Hana Rudová, Logické programování I, 17. května 2007 3 Všechna řešení, stromy, grafy Všechna řešení: příklady 1. Jaká jsou příjmení všech žen? 2. Kteří lidé mají více než 30 roků? Nalezněte jejich jméno a příjmení. 3. Nalezněte abecedně seřazený seznam všech lidí. 4. Nalezněte příjmení učitelů ze zs_stara. 5. Jsou v databázi dva bratři (mají stejné příjmení a různá jména)? 6. Které firmy v databázi mají více než jednoho zaměstnance? 1. findall(Prijmeni, z(_,Prijmeni,z,_,_,_),L). 2. findall(Jmeno-Prijmeni, (z(Jmeno,Prijmeni,_,Vek,_,_),Vek>30),L). 3. setof(P-J,[S,V,Pr,F]^z(J,P,S,V,Pr,F), L ). 4. findall(Prijmeni,(z(_,Prijmeni,_,_,P,zs_stara),(P=ucitel;P=ucitelka)),L). 5. findall(b(J1-P,J2-P),( z(J1,P,_,_,_,_),z(J2,P,_,_,_,_), J1@1. Hana Rudová, Logické programování I, 17. května 2007 3 Všechna řešení, stromy, grafy Stromy Uzly stromu Tree jsou reprezentovány termy tree(Left,Value,Right): Left a Right jsou opět stromy, Value je ohodnocení uzlu leaf(Value): Value je ohodnoceni uzlu Příklad: 6 / \ / \ / \ 2 8 / \ / 1 4 7 / \ 3 5 tree(tree(leaf(1), 2, tree(leaf(3),4,leaf(5)) ), 6, tree(leaf(7),8,[]) ) Hana Rudová, Logické programování I, 17. května 2007 4 Všechna řešení, stromy, grafy Stromy: hledáni prvku in(X,Tree) Prvek X se nachází ve stromě T, jestliže X je listem stromu T, jinak leaf(X) X je kořen stromu T, jinak tree(Left,X,Right) X je menší než kořen stromu T, pak se nachází v levém podstromu T, jinak X se nachází v pravém podstromu T Hana Rudová, Logické programování I, 17. května 2007 5 Všechna řešení, stromy, grafy Stromy: hledáni prvku in(X,Tree) Prvek X se nachází ve stromě T, jestliže X je listem stromu T, jinak leaf(X) X je kořen stromu T, jinak tree(Left,X,Right) X je menší než kořen stromu T, pak se nachází v levém podstromu T, jinak X se nachází v pravém podstromu T in(X, leaf(X)) :- !. in(X, tree(_,X,_)) :- !. in(X, tree(Left, Root, Right) ) :- XV, pak má nový strom kořen V a leaf(X) vpravo (vlevo je []) T=leaf(V) a XV, pak v novém stromě L ponechej a X přidej doprava T=tree(_,_,R) a XV, pak má nový strom kořen V a leaf(X) vpravo (vlevo je []) T=leaf(V) a XV, pak v novém stromě L ponechej a X přidej doprava T=tree(_,_,R) a XV, !, T1=tree([],V,leaf(X)) ; XV, pak má nový strom kořen V a leaf(X) vpravo (vlevo je []) T=leaf(V) a XV, pak v novém stromě L ponechej a X přidej doprava T=tree(_,_,R) a XV, !, T1=tree([],V,leaf(X)) ; XV, !, L1=L, add(R,X,R1) ; X