Search
my_select(H, [H|T], T). my_select(X, [H|T], [H|R]) :- my_select(X, T, R).
Ú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).
termvars
args_vars
args_vars([],[]). args_vars([H|T], Out) :- termvars(H, HVars), argsvars(T, Tvars), append(HVars, Tvars, Out).
Naprogramujte maticové násobení mat_prod/3:
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/3
?- column([[1,2,3],[4,5,6]], Col, Rest). Col = [1,4], Rest = [[2,3],[4,5]].
% 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).
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.
append_successors/3