![]() |
![]() |
![]() |
![]() |
isa(okeanos, uranos).
isa(koios, uranos).
isa(kronos, uranos).
isa(demeter, kronos).
isa(atlas, iapetos).
ema(iapetos, gaia).
ema(kronos, gaia).
isa(Laps, Isa)
, ema(Laps, Ema)
. ) meessoost(Isik)
ja predikaat
onu(Isik, Onu)
. meessoost(Isik):-
isa(_, Isik).
meessoost(koios).
meessost(atlas).
tagurpidi(Nimistu, Tagurpidi)
, mis muudab nimistu elementide järjekorra.
tagurpidi([],[]).
tagurpidi([Pea|Keha], Tagurpidi):-
tagurpidi(Keha, Algus),
append(Algus, [Pea], Tagurpidi).
poora(Nimistu, Tagurpidi):-
poora1(Nimistu, [], Tagurpidi).
poora1([], Tagurpidi, Tagurpidi).
poora1([Pea|Keha], Pooratud, Tulemus):-
poora1(Keha, [Pea|Pooratud], Tulemus).
poora1
liidab samm sammult esimese
argumendi (nimistu veel pöörata olev osa) elemendi teise argumendi (juba pööratud osa) esimeseks elemendiks; kui esimene argument on tühi (kogu nimistu on pöör
atud), saadakse kolmanda argumendi abil tulemus. liida([0,1,1], [1,0,1], [1,0,0,0]).
X
, teise liidetava bit Y
, eelmisel sammul saadud ülekanne C
ja arvutatakse summa bit S
ja uus ülekanne CN
; lihtne on näha, et S = (X + Y + C)(mod2), CN = (X&Y) v (X&C) v (Y&C), seega samm(X, Y, C, S, CN):-
mod2(X, Y, Xmod2Y),
mod2(Xmod2Y, C, S),
ja(X, Y, XY),
ja(X, C, XC),
ja(Y, C, YC),
voi(XY, XC, XYvXC),
voi(XYvXC, YC, CN).
ja_elem
, või_elem
, mod2
väga ökonoomselt.
Lõige ! välistab antud kohas tagurdamise (backtracking), seega näiteks predikaadi ja
esimeses lauses paremal pool olev lõige ! tagab, et ja(1, 1, X)
nobr> arvutamisel kunagi ei kasutata predikaadi ja
teist lauset; sellepärast võib seal esimesed kaks muutujat jätta anonüümseteks:
ja(1, 1, 0):-
!.
ja(_, _, 1).
voi(0, 0, 0):-
!.
voi(_, _, 1).
mod2(X, X, 0):- -- kui argumendid on võrdsed, on mod2 summa 0
!.
mod2(_,_,1).
liida([X], [Y], [NC, S]):-
samm(X, Y, 0, S, NC).
liida([X| X1], [Y|Y1], [CN, S|S1]):-
liida(X1, Y1, [C| S1]),
samm(X, Y, C, S, CN).
isa(okeanos, uranos).
isa(koios, uranos).
isa(kronos, uranos).
isa(demeter, kronos).
isa(atlas, iapetos).
ema(iapetos, gaia).
isa(Laps, Isa
), ema(Laps, Ema)
. ) sugulane(Isik, Sugulane)
? sugulane(Isik, Sugulane):-
jarglane(Isik, Keegi),
jarglane(Sugulane, Keegi). -- Siin ei või kasutada anonüüset muutujat, sest selle kasutamisel võivad predikaadi jarglane
teise argumendi väärtused eri lausetes tulla erinevad !
jarglane(Jarglane, Isik):-
isa(Jarglane, Isik).
jarglane(Jarglane, Isik):-
ema(Jarglane, Isik).
jarglane(Jarglane, Isik):-
isa(Jarglane1, Isik),
jarglane(Jarglane, Jarglane1).
jarglane(Jarglane, Isik):-
ema(Jarglane1, Isik),
jarglane(Jarglane, Jarglane1).
liige(N, X)
arvrea N
-da liikme
X
leidmiseks. liige(1,1).
liige(N,X):-
N > 1,
N1 is N-1,
liige(N1, X1),
X is 2*X1+2.
liige(N,X):-
liige1(1, N, 1, X).
liige1(N, N, X, X).
liige1(N1, N, X1, XT):-
N1 < N,
N2 is N1+1,
X2 is 2*X1+2,
liige1(N2, N, X2, XT).
tee(tallinn, rakvere,97).
tee(rakvere, kohtla_järve,73).
tee(kohtla_järve, narva,50).
tee(tallinn, paide, 97).
tee(tallinn,rakvere,96).
tee(paide, tapa, 49).
tee(tapa, rakvere, 28).
tee(rakvere, jogeva, 72).
tee(paide, poltsamaa, 39).
tee(poltsamaa, tartu, 60).
tee(poltsamaa, jogeva, 27).
tee(jogeva, mustvee, 40).
tee(kohtla_järve, mustvee, 76).
tee(jogeva, mustvee, 40).
mintee(Linn1, Linn2, Kaugus, Linnad)
kahe linna
Linn1
,
Linn2
vahelise minimaalse pik
kusega tee
Linnad
(läbitud linnade nimistu) ja teepikkuse Kaugus leidmiseks.
mintee(Linn1, Linn2, Kaugus, Linnad)
käivitab abipredikaadi mine(Linn1, Linn2, Teepikkus, Linnad)
,
mis leiab järjekordse marsruudi;
abipredikaat otsusta(Kaugus, Linnad)
võrdleb äsja leitud marsruudi pikkust seni leitud minimaalse marsuudi pikkusega,
mis salvestatakse lausega reis(Kaugus,
Linnad)
, ja kordab sisseehitatud predikaadi
fail
i (alati
ebaõnnestub, s.t. sunnib otsima eelnevale uut lahendit) abil kogu tsüklit.
Kui predikaat
mine
uut reisi enam ei leia,
leitakse lausest reis(Kaugus, Linnad)
minimaalse marsuudi pikkus. mintee(L1,L2,_,_) :-
mine(L1,L2,0,[L1]),
fail.
mintee(L1,L2,T,Ld) :-
reis(T,Ld),
retractall(reis(_,_)).
mine(L,L,T,Ld) :-
!,
otsusta(T,Ld).
mine(L1,L2,T,Ld) :-
paaseb(L1,L,Km),
not member(L,Ld),
T1 is T + Km,
mine(L,L2,T1,[L|Ld]).
otsusta(T,Ld) :-
not clause(reis(_,_),true),
!,
assert(reis(T,Ld)).
otsusta(T,Ld) :-
reis(T1,_),
T < T1,
!,
retractall(reis(_,_)),
assert(reis(T,Ld)).
otsusta(_,_).
paaseb(L1,L2,Km) :-
tee(L1,L2,Km).
paaseb(L1,L2,Km) :-
tee(L2,L1,Km).