![]() |
![]() |
![]() |
![]() |
alga :-
sisesta(Kokku) :-
hakka_lugema(Kokku,Loetud) :-
salvesta_read(Xa,Xb) :-
Predikaat suurim
arvutab nimistu maksimaalse elemendi.
suurim([X],X) :-
suurim([X|Y],Z) :-
Teed arvutab predikaat teed
, mille esimeseks argumendiks on veel ühendamata sisendite nimistu,
teiseks argumendiks - veel ühendamata väljundite nimistu ja kolmandaks - nimistu juba leitud teedest
(iga tee on nimistu sellel esinevatest võrgu tippudest). Kui predikaat teed
käivitatakse,
on tema esimeseks ja teiseks argumendik kõigi sisendite ja väljundite nimistud ja kolmas argument on tühi nimistu (ühtegi teed ei ole veel leitud).
Kui kõik sisendid-väljundid on ühendatud, on esimene ja teine argument tühjad nimistud ja
tuleb leitud teed ekraanile joonistada. Kui ei kasutata Eesti-Prologi graafikavormi
(prolog ei ole käivitatud käsuga eestigr ja viidud graafikareziimi) , tuleb predikaat
joonista_teed
ära jätta.
teed([],[],Teed) :-
teed([Xa|Xad],[Xb|Xbd],Senised) :-
Uue tee leiab (st. ühendab ühe sisendi ja sellele vastava väljundi) predikaat tee
(see on väga sarnane kahe linna vahelise tee leidmise predikaadiga).
Selle esimene argument on punkt, kus ollakse praegu, teine - kuhu on tarvis jõuda,
kolmas - nimistu võrgu tippudest, mis on juba läbitud, neljas argument
on vajalik vaid lõpliku tee väljastamiseks ja viies argument on teiste seni juba
leitud teede nimistu (seda vajatakse kontrollimiseks, et sama serva ei kasutata kaht
korda). Punktide (X,Y) ja (X1,Y1) vahelist uut teed otsides püütakse algul
liikuda vertikaalsuunas õigele (s.t. sihtpunkti) kõrgusele ja siis jätkata horisontaalsuunas
Näiteks ülaloleval joonisel sisend "[5,1]" ja väljund "[2,5]" on ühendatud just nii
(teede leidmine algab viimasena sisestatud punktist). Kui kohe
õigele horisontaalreale jõudmine ei õnnestu, liigutakse üks samm paremale ja proovitakse uuesti
Kõrvaloleval näitel on punktide "[4,1]" ja "[1,5]" ühendamisel Prolog olnud sunnitud tagurdama ja muutma algul leitud
ühendusteed [[4,1],[4,2],[3,2],[2,2],[1,2],[1,3],[1,4],[1,5]], kui punkte [1,1],[4,5] ühendada püudes selgus,
et see tee suleb edasipääsud punktist [1,1].
tee([X,Y],[X,Y],Tee,Tee,_).
tee([X,Y],[X1,Y1],Käidud,Tee,Senised) :-
tee([X,Y],[X1,Y1],Käidud,Tee,Senised) :-
tee([X,Y],[X1,Y1],Käidud,Tee,Senised) :-
kusagil([X,Y,X1,Y1],[Tee|Teed]) :-
kusagil([X,Y,X1,Y1],[_|Teed]) :-
kasutatud([X,Y,X1,Y1],Käidud,_) :-
kasutatud([X,Y,X1,Y1],_,Teed) :-
kasutatud([X,Y,X1,Y1],Käidud) :-
kasutatud([X,Y,X1,Y1],Käidud) :-
esineb([X1,Y1,X,Y],Käidud).
tee([X,Y],[X,Y],Tee,Tee,_).
tee([X,Y],[X1,Y1],Käidud,Tee,Senised) :-
tee([X,Y],[X1,Y1],Käidud,Tee,Senised) :-
tee([X,Y],[X1,Y1],Käidud,Tee,Senised) :-
Jääb järele teede väljastamine ja lahendi joonistamine ekraanile. Kuna siin kasutatakse ka LPA-Prologi graafikaprimitiive, tuleb Prolog käivitada käsklusega eestigr (sse laeb ka vajalikud graafikamoodulid), peale Eesti-Prologi käivitumist minna üle graafikareziimi (vastava funktsionaalsõrmise abil) ja salvestada programm alamkataloogi joonista.
väljasta_teed([]) :-
väljasta_teed([Tee|Teed]) :-
väljasta([[X,Y,X1,Y1]]) :-
väljasta([[X,Y,X1,Y1]|Lopp]) :-
joonista_teed([]) :-
joonista_teed([Tee|Teed]) :-
joonista_tee([[X,Y,X1,Y1]]) :-
joonista_tee([[X,Y,X1,Y1]|Muud]) :-
joonista_rida(N,R) :-
joonista_rida(_,_).
joonista_read :-
teisenda([],[]) :-
teisenda([X|Z],[MX|MZ]) :-