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(Přijmeni, z(_,Přijmeni,z,_,_,_),L). 2 . f i ndal 1 Omeno-Pri jmeni , (zOmeno, Při jmeni ,_, Vek,_,_) , Vek>30) , L) . 3. setof (P-J , [S,V,Pr,F]AzO ,P,S,V,Pr, F) , L). 4. fi ndal1(Přijmeni,(z(_,PřijmeniP,zs_stara),(P=ucitel;P=ucitelka)),L). 5. findan(b(]l-P,]2-P),( zQl.P,_,_,_,_),z(]2,P,_,_,_,_), J1@l. Hana Rudová, Logické programování I, 17. května 2007 3 Všechna řešení, stromy, grafy Všechna řešení % zOmeno, Při jmeni, Sex, Vek, Prače, Fi rma) z(petr,novak.m,30, skladni k,škoda). z(pavel,novy,m,40,mechani k,škoda). z(rostislav,lucensky,m,50,techni k,škoda). z(alena,veselá,z,25,sekretářka,škoda). zCjana, dankova, z, 35 , asistentka, škoda) . zOenka.meri nska, z, 35 , ucetni , škoda) . z(roman, maly,m,35.manažer,cs). z(alena,novotna,z,40,učitelka,zs_stara). z(david,novy,z,30,učitel,zs_stara). zCpetra,špičková,z,45,ředitelka,zs_stara). ■ Najděte jméno a příjmení všech lidí. ?- findall Omeno-Pri jmeni, z(]meno, Pri jmeni ,_,_,_,_), L) . ?- bagofC Jmeno-Prijmeni, [S,V,Pr,F] a z(]meno,Prijmeni,S,V,Pr,F) , L ). ?- bagofC Jmeno-Prijmeni, [V,Pr,F] a z(]meno,Prijmeni,S,V,Pr,F) , L ). ■ Najděte jméno a příjmení všech zaměstnanců firmy škoda a cs ?- findallC c(J,P,Firma), ( zQ , P, Fi rma) , ( Firma=skoda ; Fi rma=cs ) ), ?- bagofC >P, [P,S,V,Pr]a(zO,P,S,V,Pr,F),( F=skoda ; F=cs ) ) , L ). ?- setofC P-J, [P,S,V,Pr]a(zO,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 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 / \ / 14 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 i n (X, Tree) Stromy: přidávání add(Tree,X,TreeWithX) Prvek X se nachází ve stromě T, jestliže ■ Xje listem stromu T, jinak leaf(X) ■ Xje kořen stromu T, jinak tree(i_eft,x,Right) ■ Xje 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, !, Tl=tree([],V,leaf(X)) ; XV, !, L1=L, add(R,X,Rl) ; X