% Syntaks for sprog til afleveringsopgave % - angivet ved prūdikater, som definerer abstrakt syntaks % version 1 uden typecheck. %%%%%%%%%%%%%%%%%%%%%% % Eksempelprogrammer /* Euklids algoritme: program( program( (var(a,int) ; var(b,int)), tom, ( a:= 221 ; b:= 493 ; while( a =\= b, if( a > b, a:= a-b, b:= b-a)) ; write_text('Resultat: ') ; write(a) ; nl))). */ /* Quicksort program( program( (var(n,int); var(a, int_array(4))), proc( qsort, left, right, (var(i,int); var(j,int); var(x,int); var(w,int)), ( i:= left; j:= right; x:= a^( (left+right)//2) ; repeat( ( while(a^i j); if( left 1. % indekser: 1..Int %%%%%%%%%%%%%%%%%% proc_erk((Pe1; Pe2)):- var_erk(Pe1), var_erk(Pe2). % procedurer med en eller to parametre, % altid heltal og altid call-by-value proc_erk(proc(ProcId,ParId, Var, Saetning)):- atom(ProcId), atom(ParId), var_erk(Var), saetning(Saetning). proc_erk(proc(ProcId,ParId1,ParId2,Var, Saetning)):- atom(ProcId), atom(ParId1), atom(ParId2), var_erk(Var), saetning(Saetning). proc_erk( tom ). %%%%%%%%%%%%%%%%%% :- op(800,xfx, :=). saetning(tom). saetning( (S1 ; S2)):- saetning(S1), saetning(S2). saetning( (Var := Udtryk)):- variabel(Var), udtryk( Udtryk). saetning( if( Bet, Saetning1, Saetning2)):- udtryk(Bet), % af type bool saetning(Saetning1), saetning(Saetning2). saetning( if( Bet, Saetning)):- udtryk(Bet), % af type bool saetning(Saetning). saetning( while( Bet, Saetning)):- udtryk(Bet), % af type bool saetning(Saetning). saetning( repeat(Saetning, Bet)):- saetning(Saetning), udtryk(Bet). % af type bool saetning( write( Udtryk) ):- udtryk(Udtryk). saetning( write_text(_) ). % skrives ud med Prologs write saetning( nl ). % svarer til Prologs nl (new line) % Procedurekald: saetning( proc(Id, Udtryk)):- atom(Id), udtryk(Udtryk). saetning( proc(Id, Udtryk1, Udtryk2)):- atom(Id), udtryk(Udtryk1), udtryk(Udtryk2). %%%%%%%%%%%%%%%%%%%%% % konstanter: udtryk(Int):- integer(Int). udtryk(true). udtryk(false). % at notere arrays: udtryk( []). % array af lūngde 0 (kan ikke stŒ alene) udtryk( [Udtryk1|Udtryk2] ):- udtryk(Udtryk1), udtryk(Udtryk2). udtryk(Var):- variabel(Var). % operatorer udtryk( Udtryk1BinOpUdtryk2 ):- Udtryk1BinOpUdtryk2 =.. [BinOp,Udtryk1,Udtryk2], bin_op(BinOp), udtryk( Udtryk1), udtryk( Udtryk2). udtryk( MonOpUdtryk ):- MonOpUdtryk =.. [MonOp,Udtryk], mon_op(MonOp), udtryk( Udtryk). bin_op(+). bin_op(-). bin_op(*). bin_op(//). % heltalsdiv. bin_op(=). bin_op(>). bin_op(>=). bin_op(<). bin_op(=<). bin_op(=\=). bin_op(/\). bin_op(\/). mon_op(-). mon_op(\+). % Variable: variabel(Id):- atom(Id). % Erklūret variabel variabel( ArrayId ^ Udtryk):- atom(ArrayId), % array-variabel udtryk(Udtryk). % heltal