% vrchol(+G, ?V) :- V je vrchol grafu G. vrchol(grafE(Vs, _), V) :- member(V, Vs). vrchol(grafN(G), V) :- member(V->_, G). % hrana(+G, ?U, ?V) :- V grafu G je hrana z vrholu U do vrcholu V. % Hledání hrany v grafu reprezentovaném seznamem hran hrana(grafE(Vs, Es), U, V) :- member(U-V, Es). % Hledání hrany v grafu reprezentovaném seznamem sousedů hrana(grafN(G), U, V) :- member(U->N, G), member(V, N). % Když už máme seznam sousedů v ruce hrana(U->N, U, V) :- member(V, N). % dosazitelne(:Hrana, ?S, ?T) :- Pomocí metapredikátu Hrana je T dosažitelné z S ≠ T. dosazitelne(H, S, T) :- call(H, S, T). % S, T jsou propojeny hranou dosazitelne(H, S, T) :- call(H, S, V), dosazitelne(H, V, T). % S, T jsou dosažitelné přes V % cesta(:Hrana, ?S, ?T, ?P) :- Pomocí metapredikátu Hrana vede cesta P z S do T. cesta(H, S, T, P) :- cesta(H, S, T, [S], P). cesta(_, S, S, _, [S]). cesta(H, S, T, A, [S|P]) :- call(H, S, V), \+member(V, A), cesta(H, V, T, [V|A], P). ciselna_uloha(N, M) :- N mod 2 =:= 0, M is N/2. ciselna_uloha(N, M) :- N mod 2 =:= 1, M is 3*N+1. % cesta_iter(N, :H, ?S, ?T, ?P) :- cesta P hledaná iterativním prohlubováním délky ≤ N. cesta_iter(N, H, S, T, P) :- between(1, N, K), length(P, K), cesta(H, S, T, P). % preliti(+V1, +V2, ?U, ?V) :- ze stavu nadob U se dostaneme do stavu % nádob V přelitím, kde nádoby mají objem V1 a V2. preliti(V1, V2, U, V) :- preliti_(V1, V2, U, V), U \= V. % Něco udělat chceme preliti_(_, _, n(_, Y), n(0, Y)). % Vylijeme první nádobu preliti_(_, _, n(X, _), n(X, 0)). % Vylijeme druhou nádobu preliti_(V1, _, n(_, Y), n(V1, Y)). % Naplníme první nádobu preliti_(_, V2, n(X, _), n(X, V2)). % Naplníme druhou nádobu preliti_(V1, _, n(X, Y), n(X1, Y1)) :- X + Y > V1, X1 = V1, Y1 is Y - (V1 - X). % Z druhé do první, nevejde se preliti_(V1, _, n(X, Y), n(X1, Y1)) :- X + Y =< V1, X1 is X + Y, Y1 = 0. % Z druhé do první, vejde se preliti_(_, V2, n(X, Y), n(X1, Y1)) :- X + Y > V2, Y1 = V2, X1 is X - (V2 - Y). % Z první do druhé, nevejde se preliti_(_, V2, n(X, Y), n(X1, Y1)) :- X + Y =< V2, Y1 is X + Y, X1 = 0. % Z druhé do první, vejde se