Transaction ::
date : Date
amount : real
transaction_type : TransactionType inv mk_Transaction(-,a,-) == a > 0;
Account ::
number : AccNum
details : Details
balance : real
limit : real
transactions : seqof Transaction inv mk_Account(-,-,b,l,t) == l >= 0 and b >= l and balanceOf(t) = b
state AccountSys of
accounts : map AccNum to Account inv mk_AccountSys(a) == forall num insetdom a & num = a(num).number init ac == ac = mk_AccountSys({|->}) end
functions
balanceOf: seqof Transaction -> real
balanceOf(transln) == let dep = [t.amount | t inseq transln & t.transaction_type = <Deposit>],
withd = [t.amount | t inseq transln & t.transaction_type = <Withdrawal>] in
sum(dep) - sum(withd);
sum: seqofreal -> real
sum(seqln) == if seqln = [] then 0 elsehd seqln + sum(tl seqln) measureLen;
Len: seqofreal -> nat Len(l) == len l;
operations
addAccount(numberIn: AccNum, detailsIn: Details, limitIn: real) extwr accounts: map AccNum to Account pre numberIn notinsetdom accounts and limitIn >= 0 post accounts = accounts~ munion {numberIn |-> mk_Account(numberIn, detailsIn, 0, limitIn,[])};
removeAccount(numberIn: AccNum) extwr accounts: map AccNum to Account pre numberIn insetdom accounts post accounts = {numberIn} <-: accounts~;
deposit(numberIn: AccNum, dateIn: Date, amountIn: real) extwr accounts: map AccNum to Account pre numberIn insetdom accounts and amountIn >= 0 postlet bal = accounts~(numberIn).balance,
trans = accounts~(numberIn).transactions in let newTrans = mk_Transaction(dateIn, amountIn, <Deposit>) in
accounts = accounts~ ++ {numberIn |-> mu(accounts~(numberIn),
balance |-> bal + amountIn,
transactions |-> trans ^ [newTrans])};
withdraw(numberIn: AccNum, dateIn: Date, amountIn: real) extwr accounts: map AccNum to Account pre numberIn insetdom accounts and amountIn >= 0 and
accounts(numberIn).balance -amountIn >= accounts(numberIn).limit postlet bal = accounts~(numberIn).balance,
trans = accounts~(numberIn).transactions in let newTrans = mk_Transaction(dateIn, amountIn, <Withdrawal>) in
accounts = accounts~ ++ {numberIn |-> mu(accounts~(numberIn),
balance |-> bal - amountIn,
transactions |-> trans ^ [newTrans])};
changeDetails(numberIn: AccNum, detailsIn: Details) extwr accounts: map AccNum to Account pre numberIn insetdom accounts post accounts = accounts~ ++ {numberIn |-> mu(accounts~(numberIn),details |-> detailsIn)};
changeLimits(numberIn: AccNum, limitIn: real) extwr accounts: map AccNum to Account pre numberIn insetdom accounts and limitIn >= 0 and
accounts(numberIn).balance >= limitIn post accounts = accounts~ ++ {numberIn |-> mu(accounts~(numberIn),limit |-> limitIn)};
getDetails(numberIn: AccNum) detailsOut: Details extrd accounts: map AccNum to Account pre numberIn insetdom accounts post detailsOut = accounts(numberIn).details;
getBalance(numberIn: AccNum) balanceOut: real extrd accounts: map AccNum to Account pre numberIn insetdom accounts post balanceOut = accounts(numberIn).balance;
getLimit(numberIn: AccNum) limitOut: real extrd accounts: map AccNum to Account pre numberIn insetdom accounts post limitOut = accounts(numberIn).limit;
getAllTransactions(numberIn: AccNum) transactionsOut: seqof Transaction extrd accounts: map AccNum to Account pre numberIn insetdom accounts post transactionsOut = accounts(numberIn).transactions;
contains(numberIn: AccNum) query: bool extrd accounts: map AccNum to Account post query <=> numberIn insetdom accounts;
isEmpty() query: bool extrd accounts: map AccNum to Account post query <=> accounts = {|->};
getTotal() totalOut: nat extrd accounts: map AccNum to Account post totalOut = carddom accounts
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.