====== Generative predicates ======
1. Write the predicate ''sublist/2'' which constructs **each** sublist of a given list. Hint: use ''append''.
?- sublist([7,2,9],R).
% R will subsequently be bound to [], [7], [2], [9], [7,2], [2,9], [7,2,9]
2. Rewrite the predicate such that the empty list is reported only once.
3. Write the predicate ''natlist/1'' which generates **each** finite list of natural number in ascending order.
?- natlist(R).
R = [0] ;
R = [0,1] ;
R = [0,1,2] ;
...
4. Write the predicate ''oddOnly/2'' which removes all even integers from a list.
?- oddOnly([1,2,3,4],R).
R = [2,4].
5. Write the predicate ''oddList/1'' which generates all finite lists of odd numbers, in ascending order.
6. Write a predicate ''eqelem/1'' which generates all lists of **uninstantiated** variables which must be equal. Example:
?- eqelem(L), length(L,3), L=[0|_].
L = [0,0,0].
7. Use the previous predicate to write ''repeat/3'' which returns a list containing the same value ''X'' repeated ''K'' times.
8. Write a predicate ''pal/1'' which generates **all** lists of palindromes. Hint: use only ''append''.
9. Write a predicate ''ksubset/3'' where ''ksubset(C,K,V)'' generates all sets (represented as lists) ''C'' with ''K'' elements from the list ''V''. Hint: build the recursion scheme after ''K''.
10. Write a predicate ''subset'' where ''subset(C,V)'' generates all subsets of ''V''. Hint: build the recursion scheme after **each** element in V.
11. **What is the difference between ''?- length(C,K), subset(C,V).'' and ''?- ksubset(C,K,V).''?** where ''K'' is an instantiated variable (with a value less or equal to the size of ''V''). Write your answer down.
12. Implement ''kvertexcover/3'' where ''kvertexcover(C,K,G)'' generates all ''K''-coverings in ''G''. ''G=[V,E]'' where ''V'' is a set of nodes and ''E'' is a set of undirected edges. Hint: use negation to express a //universal// constraint.
13. Implement ''kclique/3''.
14. Implement ''connected/4'', where ''connected(X,Y,P,G)'' generates all paths ''P'' between nodes ''X'' and ''Y'' in graph ''G''.
15. Implement ''ham/2'' where ''ham(P,G)'' generates all **hamiltonian paths** in G.