![]() |
![]() |
![]() |
![]() |
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).
vöi3(X1,X2,X3,Väljund) :-
vöi_skeem(X1, X2, Väljund1),
vöi_skeem(Väljund1, X3, Väljund).
Sisse1
ja Sisse2
nn. välistav summa (summa mod2 ehk x-or summa)
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).
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
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).