Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 ====