<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">

% reprezentacja grafu jako listy termĂłw kr(A,B) - krawÄdĹş z A do B
% [kr(1,3), kr(2,3), kr(3,5), kr(5,7), kr(3,6), kr(6,9)]

% 1 -&gt; 3 -&gt; 5 -&gt; 7

% connect(Graf, A, B) gdy Graf jest listÄ krawÄdzi kr(A,B) i istnieje niepusta ĹcieĹźka z A do B w tym grafie (po jednym sukcesie na ĹcieĹźkÄ)

connect(Graf, A, B) :-
	member(kr(A, B), Graf).

connect(Graf, A, C) :-
%	connect(Graf, A, B), % jeĹźeli zrobimy tak, to siÄ bÄdzie zawieszaÄ i odnosiÄ wielokrotne sukcesy
	member(kr(A, B), Graf),
	connect(Graf, B, C).


% drugi wariant gdzie graf reprezentujemy jako predykaty edge(X, Y) tak jak na poczÄtku drzewa genealogiczne
% w tym wariancie mamy jeden graf do dyspozycji w caĹym Ĺrodowisku (moĹźna by dodaÄ trzeci argument identyfikujÄcy o ktĂłry graf chodzi).


% edge(A, B) gdy w caĹym Ĺrodowisku istnieje krawÄdĹş z A do B

edge(1,3).
edge(2,3).
edge(3,4).
edge(4,5).
edge(5,7).
edge(3,6).
edge(6,9).
edge(9,1). % na poczÄtek grafy sÄ acykliczne !!!
edge(2, 10).

% connect(A, B) gdy istnieje niepusta ĹcieĹźka z A do B wĹrĂłd "edge" (po jednym sukcesie na ĹcieĹźkÄ)

connect(A, B) :-
	edge(A,B).

connect(A, C) :-
	edge(A,B),
	connect(B, C).

% path(A, B, P) gdy P = opis niepustej ĹcieĹźki z A do B, tzn. P = [A, ..., B]

path(A, B, [A, B]) :-
	edge(A,B).

path(A, C, [A | P]) :-
	edge(A, B),
	path(B, C, P).

% nonmember(X, L) gdy X nie jest elementem listy L

nonmember(_X, []).

nonmember(X, [Y | L]) :-
	X \= Y,
	nonmember(X, L).

% pathC(A,B,P) w dowolnym grafie skierowanym (potencjalnie cyklicznym), ĹcieĹźki niepuste, bez powtĂłrzeĹ

pathC(A, B, P) :- pathC(A, B, P, [A]).

% pathC(A, B, P, V) gdy P to ĹcieĹźka z A do B omijajÄca wierzchoĹki z V (nie liczÄc pierwszego A)

pathC(A, B, [A, B], V) :-
	edge(A, B),
	nonmember(B, V).

pathC(A, C, [A | P], V) :-
	edge(A, B),
	nonmember(B, V),
	pathC(B, C, P, [B | V]).
	
	
% euler(G, P) gdy dany graf G jako lista kr(A,B) jest grafem Eulera i P to jakaĹ jego ĹcieĹźka Eulera

% graf G jest nieskierowany, krawÄdzie w nim sÄ wymieniane raz, wiÄc [kr(1,2), kr(3,2), kr(3,1)] to
% nieskierowany trĂłjkÄt

euler([kr(A, B)], [A, B]).  % to jest juĹź zaĹatwione przez weĹş napisane poniĹźej
euler([kr(B, A)], [A, B]).  % ale gdy to uproĹcimy jak niĹźej to jest problem

% euler([], [_X]).    % moĹźna tak krĂłtko, ale jest problem z pustym grafem

euler(G, [X, Y | P]) :-
	wez(G, X, Y, G1),
	euler(G1, [Y | P]).
	

% umiejÄtnoĹÄ wyjÄcia (wziÄcia) krawÄdzi z grafu G:

% wez(G, X, Y, G1) gdy G1 to graf G z wyjÄtÄ krawÄdziÄ z X do Y

wez([kr(X, Y) | G], X, Y, G).

wez([kr(Y, X) | G], X, Y, G).

wez([E | G], X, Y, [E | G1]) :-	wez(G, X, Y, G1).













</pre></body></html>