/* PLAN - program znajdowania trasy polaczen miedzy miastami */ %%% Przeszukiwanie wgłąb z nawrotami :- dynamic(p/1). :- dynamic(q/2). d(s,g). d(s,n1). d(s,n2). d(n1,n2). d(n1,n4). d(n1,n3). d(n2,n3). d(n3,n4). d(n3,n5). d(n4,n5). d(n4,n6). d(n5,n6). d(n6,g). nodes([s,n1,n2,n3,n4,n5,n6]). %%% domknięcie symetryczne relacji d/2 przejazd(X,Y):- d(X,Y). przejazd(X,Y):- d(Y,X). %%% domknięcie tranzytywne relacji przejazd szukaj_trasy(Cel,Cel,Trasa,Trasa):- !. szukaj_trasy(Miasto,Cel,Robocza,Trasa):- przejazd(Miasto,NoweMiasto), not(member(NoweMiasto,Robocza)), szukaj_trasy(NoweMiasto,Cel,[NoweMiasto|Robocza],Trasa). %%% inicjacja szukania plan(Start,Cel,Trasa):- szukaj_trasy(Cel,Start,[Cel],Trasa). %%% Find all plans from 's' to 'g'. fap(Plans) :- findall(Trasa, plan(s,g,Trasa),Plans). %%% Find all plans and assert; p(). fap-assert:- plan(s,g,Plan), assert(p(Plan)), fail. fap-assert. %%% Count: zliczanie krotnosci wezla w planach. count(N,_):- p(P), member(N,P), add(N), fail. count(N,K):- q(N,K). add(N):- \+ q(N,_),!, assert(q(N,1)). add(N):- retract(q(N,K)), K1 is K+1, assert(q(N,K1)). countall:- nodes(LN), select(N,LN,_), count(N,K), write('node: '), write(N), write(' in: '), write(K),nl.