14

Loogiliste skeemide modelleerimine

Prologi abil on lihtne kontrollida loogiliste skeemide tööd, s.t. millise seose sisendite-väljundite vahel skeem realiseerib. Selgitame Prologile algul, kuidas töötavad köige lihtsamad skeemid: eitus (ei-skeem), disjunktsioon (vöi_skeem) ja konjunktsioon (ja_skeem); vastavate predikaatide esimesed attribuudid on sisendid, viimane - väljund:

ei_skeem(0,1).
ei_skeem(1,0).

vöi_skeem(0, 0, 0).
vöi_skeem(0, 1, 1).
vöi_skeem(1, 0, 1).
vöi_skeem(1, 1, 1).

ja_skeem(0, 0, 0).
ja_skeem(0, 1, 0).
ja_skeem(1, 0, 0).
ja_skeem(1, 1, 1).

Funktsiooni ( X1 v X2) & X3 realiseerib predikaat

vöi3(X1,X2,X3,Väljund) :-
vöi_skeem(X1, X2, Väljund1),
vöi_skeem(Väljund1, X3, Väljund).

Sisendite Sisse1 ja Sisse2 nn. välistav summa (summa mod2 ehk x-or summa)
(Sisse1+Sisse2) (mod2) = (ei(Sisse1)&Sisse2) v (Sisse1&ei(Sisse2))
määrab predikaat vöi1 koos abipredikaadiga ei_Xja_Y:

vöi1(Sisse1,Sisse2,Väljund) :-
ei_X_ja_Y(Sisse1, Sisse2, Väljund11),
ei_X_ja_Y(Sisse2, Sisse1, Väljund12),
vöi_skeem(Väljund11, Väljund12, Väljund).
ei_X_ja_Y(Sisse1, Sisse2, Väljund) :-
ei_skeem(Sisse1, Väljund1),
ja_skeem(Väljund1, Sisse2, Väljund).

Olgu X1X2 kahekohaline kahendarv (X1 - arvu esimene bit, X2 - teine bit). Kahe kahekohalise kahendarvu X1X2 ja Y1Y2 kolmekohalise summa S1S2S3 arvutab predikaat summa2. Abipredikaat summa_ja_meeles teostab "tulba kujul" arvutamisel ühe püsttulba juures sooritatavad operatsioonid: arvutab üksteise kohal olevate kahendkohtade ja eelmise koha liitmisel saadud ülekande pöhjal summa kahendnumbri ja uue ülekande:

summa2(X1,X2,Y1,Y2,S1,S2,S3) :-
summa_ja_meeles(X2, Y2, 0, S3,C1),
summa_ja_meeles(X1, Y1, C1, S2, S1).

summa_ja_meeles(X, Y, C, S, C1) :-
summa(X, Y, C, S),
meeles(X, Y, C, C1).

meeles(X, Y, C, C1) :-
ja_skeem(X, Y, XjaY),
ja_skeem(X, C, XjaC),
ja_skeem(Y, C, YjaC),
vöi3(XjaY, XjaC, YjaC, C1).

summa(X, Y, C, Summa) :-
vöi1(X, Y, Xvöi1Y),
vöi1(C, Xvöi1Y, Xvöi1Yvöi1C),
ja_skeem(Y, C, YjaC),
ja_skeem(X, YjaC, XjaYjaC),
vöi_skeem(Xvöi1Yvöi1C, XjaYjaC, Summa).

Ülesanne

Koosta predikaat liida(X, Y, Z), mis liidab kaks n-kohalist kahendarvu, kus X ja Y on kuitahes pikad kahendarvud, mis on esitatud oma bittide nimistuna (st. arv 100101 esitatakse kujul [1,0,0,1,0,1]) ja Z on arvude X ja Y summa (esitatud samal viisil).


Küsimused, probleemid:
jaak@cc.ttu.ee

Tagasi loengute sisukorra juurde