Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
pp:lplcut [2019/05/06 13:55] dmihai [Cut] |
pp:lplcut [2019/05/06 14:30] (current) dmihai [Colectarea rezultatelor] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== TODO ===== | + | ===== Cuts ===== |
Scopul laboratorului: | Scopul laboratorului: | ||
- | - TODO | + | - aprofundarea mecanismului de căutare din prolog |
- | - TODO | + | - înțelegerea cut-urilor ca mecanism de control al căutării |
+ | - distincția între "green cuts" și "red cuts" | ||
+ | - metode de colectare a rezultatelor | ||
==== Cut ==== | ==== Cut ==== | ||
Line 134: | Line 136: | ||
Fără acel cut, predicatul ar funcționa ca variante dinainte (cea fără variabila ''Z''). Astfel de cut-uri, care alterează comportamentul programului, se numesc "red cuts". O recomandare comună e că ar trebui folosite cu grijă, pentru că pot îngreuna înțelegerea codului. | Fără acel cut, predicatul ar funcționa ca variante dinainte (cea fără variabila ''Z''). Astfel de cut-uri, care alterează comportamentul programului, se numesc "red cuts". O recomandare comună e că ar trebui folosite cu grijă, pentru că pot îngreuna înțelegerea codului. | ||
- | ==== Negation as failure ==== | ||
- | ==== Colectare rezultate ==== | + | ==== Colectarea rezultatelor ==== |
Fie următoarea bază de cunoștiințe genealogice: | Fie următoarea bază de cunoștiințe genealogice: | ||
Line 250: | Line 251: | ||
?- | ?- | ||
</code> | </code> | ||
- | |||
- | <note> | ||
- | În ultima interogare, nu contează dacă predicatul folosit în exterior este ''bagof/3'' sau ''findall/3''. Goal-ul de demonstrat (''bagof(C, parent(P, C), L)'') nu conține variabile "din afară". | ||
- | </note> | ||
Ca urmare a felului de funcționare, o diferență notabilă între ''findall/3'' și ''bagof/3'' este că, atunci când goal-ul nu poate fi satisfăcut, ''findall/3'' reușește, generând o listă vidă, iar ''bagof/3'' eșuează. | Ca urmare a felului de funcționare, o diferență notabilă între ''findall/3'' și ''bagof/3'' este că, atunci când goal-ul nu poate fi satisfăcut, ''findall/3'' reușește, generând o listă vidă, iar ''bagof/3'' eșuează. | ||
Line 321: | Line 318: | ||
?- | ?- | ||
</code> | </code> | ||
+ | |||
+ | <note> | ||
+ | În mod default, swi-prolog trunchiază listele rezultat, afișând doar primele elemente și ''...'' pentru restul. Pentru a schimba acest comportament folosiți interogarea ''set_prolog_flag(answer_write_options,[max_depth(0)]).'': | ||
+ | |||
+ | <code> | ||
+ | ?- findall(P, parent(P, C), L). | ||
+ | L = [bestla, bestla, bestla, jorth, frigg, buri, borr, borr, borr|...]. | ||
+ | |||
+ | ?- set_prolog_flag(answer_write_options,[max_depth(0)]). | ||
+ | true. | ||
+ | |||
+ | ?- findall(P, parent(P, C), L). | ||
+ | L = [bestla,bestla,bestla,jorth,frigg,buri,borr,borr,borr,odin,odin]. | ||
+ | </code> | ||
+ | |||
+ | Soluție alternativă găsiți [[https://stackoverflow.com/a/36948699|aici]]. | ||
+ | </note> | ||
+ | |||
==== Exerciții ==== | ==== Exerciții ==== | ||
+ | |||
+ | - Definiți predicatul ''cartesian(L1, L2, R)'' care construiește [[http://mathworld.wolfram.com/CartesianProduct.html|produsul cartezian]] al ''L1'' cu ''L2''. | ||
+ | - Definiți predicatul ''union(L1, L2, R)'' care construiește reuniunea a două mulțimi codificate ca liste. | ||
+ | - Definiți predicatul ''intersection(L1, L2, R)'' care construiește interesecția a două mulțimi codificate ca liste. | ||
+ | - Definiți predicatul ''diff(L1, L2, R)'' care construiește diferenta a două mulțimi codificate ca liste. | ||
+ | - Definiți predicatul ''pow(S, R)'' care construiește [[http://mathworld.wolfram.com/PowerSet.html|power set-ul]] multimii ''S''. | ||
+ | - Definiți predicatul ''perm(S, R)'' care generează toate permutările lui ''S''. | ||
+ | - Definiți predicatul ''ar(K, S, R)'' care generează toate aranjamentele de dimensiune ''K'' cu elemente luate din ''S''. | ||
+ | - Definiți predicatul ''comb(K, S, R)'' care generează toate combinările de dimensiune ''K'' cu elemente luate din ''S''. | ||
==== Recommended Reading ==== | ==== Recommended Reading ==== |