luận văn được phát triển thêm dựa vào ý tưởng của tác giả J.Celko trong một bài báo đăng trên tạp chí Byle tháng 11-1988, cách thức xây dựng một bộ tự động phát sinh chương trình cho người máy
Trang 1PHULUCB
HAILdp
(jffrong thu~t loan ma chung ta se xet du'di day, chung ta se dQc
\tJ,cac gia trj cua mQt ham logic y ghi trong mQt t~p tin van ban,
sau d6 d1!a vao Bjnh ly 1 Chu'ong 3, chung ta phat sinh h~ phu'ong trinh
c6 cac fin s61a Wpi.Bc3giai h~ phu'ong trloo ay, phu'ong phap Gauss se
du'<;lcsii' dvng Bic3md~c bi~t trong thu~t loan nay la sau khi xac djnh
du'<;lccac h~ s6 Wpithi ham ngu'ong tuy6n HOO
y =IwpiXpi
ham ngu'ong tu'ongung vdi cac h~ s6 Wpihi~n t~i.
B.1 Boc nhung gia Ir! cua ham lOgicIll'mOlfile
Ngu'oi ta cho san t~p nhung vecto input va cac gia trj output trong mQt bang nhu' Bang B.1 Chung ta mu6n hill tru bang nay nay trong mQt t~p tin van ban Chung ta nh~n xet ding dc3hill trfi OOunggia trj cua mQt ham logic, thi khong can phcli hill tat ca nhung gia tri cua bang chan trio Ch~ng h~n vdi ham lOgic c6 gia trj cho trong Bang B.1., chung ta chi can lu'u l~i nhung gia trj d cQt cu6i cung, con OOungcQt dung phia tru'dc n6,
ch~ng qua chi la nhung thanh phan cua nhung vecto mftu 000, 001, ,111.
Nhu' v~y t~p tin van ban lu'u trii' gia trj cua ham logic y c6 d~ng
thuc chung nhu' san:
s6 phan tii' dau phan cach gla IT!cua y." . ?
Trang 2Phl,JIl,JcB 65
Ban!! B.l: Gid trj cua mqthamnl§gic
Chung ta se md t~p tin nay, dQc philn tii' dilu tieD xem d6 nhumQt gia tri dc3'dinh fa dU<;1cs6 chi~u cua khong gian m~u, gia tri nay se dU<;1c
gall vao bie'n numrows Tie'p IDeo Ia tU'ngphiln tii' trong t~p tin se dU<;1c dQc va gall VllOmang mQtchi~u TRUEVALUE.
Thd h;1cgetint() dQc tU'ngky nr trong t~p tin van ban va chuyc3'n
thanh gia tri nguyen cho de'n khi dQcde'n ky nr phan cach
int getint ( FILE *f )
int null, c, signum;
signum = +1;
nUll = 0;
c = '0';
while ( (c != SEPARATOR)
if ( c == '-' ){
signum = -1;
&& (c != LINEFEED) && (c!= EOF) ) {
} else{
null = num * 10 + c - '0';
}
c = fgetc ( f );
};
nUll *= signum;
return nUll;
Trang 3PhI) Il)cB 66
Thu Wcgettruevaluematrix() dQc tUng gia tri cua ham logic y tU
file mo ta tn~n va gall vao tUngph~ntti' mang a[].
void gettruevaluematrix ( FILE *f, int *a )
{
int i;
for ( i = 0; i < numrows; i ++ ) {
a[i] = getint ( f );
?
B.2 TIm t~p hQ'p Substratum cua mOt vecto' mau cho san B<3'tim duQc t~p hQp substartum cua vecto mall Pi chung ta se dung phuong phap danh ddu nhung vectd cua t~p hQp substratum tren ma tr~n A Phuong phap danh dftu duQc mo ta nhu hinh ve sail: Po PI P2 P3 000 001 010 0 1 1 D vectd P3 cho t~p substratum Sollia nhung vecto 0 0 0, 0 0 1, 0 1 0, 0 1 1 D Cac vectd nay duQc danh dftu vao ma tr~n Atren dong thli 3 Bang B.2 Ma trtJnA co mJi dong lil tcJp h(JpS V' il.III.III ::.: .'.1:.:1.11.11 ,, ::,",1:1.I':::ii::I,I:.II:I:.I : I'i:'::' ::I: 1IIIi::i:::::::.:,II: I ::::::::i:ill:i11::II::::::I:I:I.:.:.II I::I:,::.li .
1111111.lllll!1
1
:::::::SaHII
Trang 4PhI,!Il,!cB 67
void findsubstratumset ( int p )
int k, mask;
mask = 1 « dimension;
for ( k = 0; k < mask; k ++ ) {
if ( ( k & P ) == k ) {
A[ P * numcols + k ] = 1;
} else{
A[ P * numcols + k ] = 0;
MQt di~m nh~n xet nho trong thu tQC tren Hi bie'ndimension la s6
chi~u cua khonggian mfiu P co th~ tIm duQc dc3dang thong qua bie'n
numrows la bie'n quy dinh t6ng s6 dong cua ma tr~n A Con t6ng s6 cQt
cua ma tr~n A chti'a trong bie'n numcols thl bftng numrows + 1.
Khi da co nhfi'ng t~p substratum Spi cua mQivecto mfiuPi , vi~c
l~p h~ phuong trlnh nhu trong Bang 3 trd nen ra't don gian: chi cfin ghi l~i
gia tri cua ham logic y dang chti'a trong mang TRUEVALUE vao cQt cu6i
clIng cua ma tr~n A. Cach lam duQc th~ hi~n qua thu tQc
makesystemequation( ).
void makesystemequation ( void
{
int i;
for ( i = 0; i < numrows; i ++ ) {
findsubstratumset ( i );
A[ i * numcols + numcols -1 ] =TRUEVALUE [ i ];
Thu tQClistsystemequation() co chti'c nang hi~n thi h~ phuong trlnh
ra man hlnh
void listsystemequation ( void)
int i, j;
for ( i = 0; i < numrows; i ++ ){
for ( j = 0; j < numcols; j ++ ) {
cout «A[i * numcols + j] « " "
, }
cout « "\n";
Trang 5PhI,!Il,!cB 68
Thu Wc getdim() lily v~ s6 chi~u cua khong gian m~u
int getdim ( void)
int i, X;
i = 0;
X = numrows;
do{
i ++;
X »= i;
)while ( X != 1 );
return ++i;
Sau khi chung ta da: di~n vao ma tr~n A mQi t~p Spi cua nhung vecto m~u pj va nhung ghi tri cua ham logic y vao cQt cu6i cling cua ma
tr~n nay, thi cling luc do chung ta da: thu duQc ma tr~n h~ s6 cua nhung phuong trinh
Y(pj) =l:Wqj
trong do t6ng duQc lily tren nhung vectd qj E Spi.
H~ phuong trinh nay se duQc ghH bAng phuong phap cheo hoa the
hi~n qua thu tl;1cdiagmatrix() de cu6i cling chung ta duQc ma tr~n duong
cheo ma tit ca nhung gia tri lIen vectd cQtcu6i cling chinh la nghi~m cua h~ phuong trinh
void diagmatrix ( int *a )
int i, j, p, q, n; int r,s;
for ( i = 0; i < numrows; i ++ ){
j = -1;
do{
j ++;
)while ( a [i*numcols+j] == 0 );
p =-1;
do{
p ++;
)while ( a[p*numcols+j] == 0 );
s = a[p*numcols+j];
for ( q = p + 1; q < numrows; q ++ ) {
if ( a[q*numcols+j] != 0 ) {
r = a[q*numcols+j];
for ( n = j; n < numcols; n ++ ) {
a[q*numcols+n]+=r/s*a[p*numcols+n];
Trang 6Phl,JIl,JcB 69
Bie't f~ng ma tr~n A sau khi cheo h6a thl vectd cC)tcu6i cung chinh
la nghi~m cua h~ phu'dng trlnh thl vi~c rut fa nhii'ng nghi~m d6 d~ gall
vao cac bie'n Wqjkhong kh6 khan Him Chung ta c6 thu ~c getsolutionO
du'oi day
void getsolution ( int *a, int *w )
int i;
for ( i = 0; i < numrows; i ++ ) (
w[i] = a[i*numcols + numcols - 1];
Sau khi da thu du'Qccac nghi~m cua h~, chung ta se cai d~t ham ngu'ong tuye'n tinh dt1atheo h~ iliac:
y(pJ =};Wp~pi
Va VIham mask Xpila tich cua nhii'ng phep chie'u ten tung thanh ph~n tQa dC),chiing h~n XOll= XjX2,ham ngu'ongtuye'n tinh se du'Qccai d~t b~ng cach ang voi m6i vectd m~u Pi chung ta se l~p fa mang t[] bi~u di~n tung ky so' nhj phan cua Pi , vi dV voi vec td m~u P3=011 thl cac
ph~n tit mang t[] la t[OJ=0, t[1] =1; t[2J=I Dt1atren mang t[],trong so' nhii'ng d6i so' truy~n qua ham ngu'ong chung ta tinh tich nhii'ng x[jJ voi nhii'ng chi so'j ma t[jJ :;r!: O.
float threshold ( int *x )
{
int i, j, mask, t[64];
float s ,y = 0;
for ( i = 0; i < numrows; i ++ ) {
s = 1;
t[O] = 1;
for ( j = 1; j <= dimension; j ++ ) { mask = 1 « ( j - 1 );
t[dimension - j + 1] = ( mask & i ) / mask;
} for ( j = 0; j <= dimension; j ++ ) {
Trang 7PhVIvc B 70
if I t[j] != 0 )1
s *= x[j];
s *= w [i] ;
Y += s;
return y;
void main I)
FILE *f;
f = fopen I "d:\\luanvan\\twolayer\\input.dat", "r" );
numrows = getint If);
numcols = numrows + 1;
gettruevaluematrix I f, TRUEVALUE );
fclose If);
dimension = getdim I);
cout « "dimension: " « dimension « "\n";
makesystemequation I);
listsystemequation I);
diagmatrix I A );
listsystemequation I);
getsolution I A, w );
listsolution I w );
x[O] = 1;
x[l] = 0;
x[2] = 1;
x[3] = 0;
cout « "threshold function: " « threshold I x ) « "\n";