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 )).