Mercurial > hg > Applications > Tokio
view Examples/etc/memory @ 0:cfb7c6b24319
Initial revision
author | kono |
---|---|
date | Thu, 30 Aug 2007 14:57:44 +0900 |
parents | |
children |
line wrap: on
line source
store(Adr,Value0,Contents) :- Value = Value0, Now = Contents, store0(0,Adr,Value,Now,Next), Contents <- Next. store0(Adr,Adr1,Value,N,NN) :- Adr=Adr1,!,N=[_|Tail],NN=[Value|Tail]. store0(I, Adr,Value,N,NN) :- N=[V|Now],NN=[V|Next], I1 = I+1, store0(I1,Adr,Value,Now,Next). fetch(Adr,Value0,Contents) :- Now = Contents, fetch0(0,Adr,Value,Now), stable( Contents ), Value0 <- Value. fetch0(Adr,Adr1,N,NN) :- Adr=Adr1,!,N=Value,NN=[Value|_]. fetch0(I, Adr,N,NN) :- N=Value,NN=[_|Now], I1 = I+1, fetch0(I1,Adr,Value,Now). memory(Adr,Cmd,Data,Contents) :- ( if Cmd=read then fetch(Adr,Data,Contents) else if Cmd=write then store(Adr,Data,Contents) else stable(Contents)) && memory(Adr,Cmd,Data,Contents). memory(Adr,Cmd,Data,Contents) :- empty. test :- store(0,0,Contents) && store(3,1,Contents) && stable(Contents) && fetch(0,A,Contents),fetch(3,B,Contents), fin(write( (A,B) )). test2 :- length(20),( Cmd=write,Data=1,Adr=0 && Cmd=write,Data=2,Adr=3 && Cmd=off && Cmd=read,Adr=0 && Cmd=off && Cmd=read,Adr=3 && Cmd=off ), memory(Adr,Cmd,Data,Contents), #write((Adr,Cmd,Data)),#nl. % memory using global variable :-static([cmd,adr,data,contents]). memory :- ( if *cmd=read then fetch else if *cmd=write then store) && memory. memory :- empty. store :- Value = *data, Now = *contents, Adr = *adr, Value = *data, store0(0,Adr,Value,Now,Next), *contents <= Next. fetch :- Adr = *adr, Now = *contents, fetch0(0,Adr,Value,Now), *data <= Value. test3 :- length(20),( *cmd:=write,*data:=1,*adr:=0 && *cmd:=write,*data:=2,*adr:=3 && *cmd:=off && *cmd:=read,*adr:=0 && *cmd:=off && *cmd:=read,*adr:=3 && *cmd:=off ), memory, #(( Adr = *adr, Cmd = *cmd, Data = *data, write((Adr,Cmd,Data)), nl )).