Warning
This page is located in archive.

Úlohy předmětu FLP

Semestrální úlohy

Dobrovolné domácí úlohy

Vlastní implementace "select/3"

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.

courses/a4b33flp/2012/assignments.txt · Last modified: 2016/03/01 01:37 by vyskoji1