====== Úlohy předmětu FLP ======
my_select(H, [H|T], T).
my_select(X, [H|T], [H|R]) :-
my_select(X, T, R).
==== Všechny proměnné termu ====
//Úkol://
Extract variables from a structured term:
?- term_vars(f(a,X,g(c,h(Y)),z), V).
V=[X,Y].
//Řešení://
**1)** Pokud je term proměnnou, vrať seznam té jedné proměnné.
term_vars(X, [X]) :- var(X), !.
**2)** Pokud je term konstantním nebo funkčním symbolem, vrať proměnné ze všech jeho argumentů.
term_vars(X, Vars) :-
X =.. [_Pred|Args],
argsvars(Args,Vars).
**3)** Proměnné ze seznamu argumentů: Spoj všechny proměnné v hlavě (která může být složeným termem, proto použijeme ''termvars'') se všemi proměnnými v ocase (pomocí rekurze na ''args_vars'').
args_vars([],[]).
args_vars([H|T], Out) :-
termvars(H, HVars),
argsvars(T, Tvars),
append(HVars, Tvars, Out).
==== Maticové násobení ====
//Úkol://
Naprogramujte maticové násobení ''mat_prod/3'':
?- mat_prod([[1,2],[3,4]], [[0,1],[2,3]], X).
X = [[4,7],[8,15]].
//Tip://
Nejdříve nadefinujte a použijte predikát ''column/3'':
?- column([[1,2,3],[4,5,6]], Col, Rest).
Col = [1,4],
Rest = [[2,3],[4,5]].
//Řešení://
% Slices a column from a matrix
column([], [], []).
column([[H|Row]|RowTail], [H|Col], [Row|RowRest]) :-
column(RowTail, Col, RowRest).
% Scalar product of two vectors
sca_prod([], [], 0).
sca_prod([H1|T1],[H2|T2], Z) :-
sca_prod(T1, T2, Y),
Z is Y + H1 * H2.
% Multiplies a matrix and a single row
row_mult(_, List, []) :- \+ (member(X, List), X \= []), !.
row_mult(Row, Matrix, [E|Rest]) :-
column(Matrix, Col, MatRst),
sca_prod(Row, Col, E),
row_mult(Row, MatRst, Rest).
% Matrix multiplication
mat_mult([], _, []).
mat_mult([Row|Rows], Matrix, [Mult|Rest]) :-
row_mult(Row, Matrix, Mult),
mat_mult(Rows, Matrix, Rest).
==== DFS s cestou ====
append_successors(City, Open, NewOpen) :-
findall(Succ, w(City, Succ), List),
append(Open, List, NewOpen).
bfs1(From, Goal) :- bfs1([From], Goal, []).
bfs1([Goal|_], Goal, _).
bfs1([From|Open], Goal, Closed) :-
\+ member(From, Closed), !,
append_successors(From, Open, NewOpen),
bfs1(NewOpen, Goal, [From|Closed]).
bfs1([_|Open], Goal, Closed) :-
bfs1(Open, Goal, Closed).
Adaptujte kód DFS výše tak, aby si zapamatoval cestu. Můžete použít již upravený predikát ''append_successors/3'' z [[http://pastebin.com/brYzUyms]].