% les précédences pour la syntaxe MIL
% de manière à ce que le lecteur de PROLOG lise et écrive le programme
% directement comme un terme = arbre de syntaxe abstraite.
% Version réversible, en conservant en prolog la liste des variables

:- module(mil,
	[ op( 800, xfy, [ := ]),	% ":=" associant à droite, priorité > op. arith.(200 & 400)
	  op( 800, fx, [ lire, ecrire ]), % unaires, de même priorité 
	  op( 700, xfx, [<=, <>]),  % relateurs inconnus de Prolog
	  prog1/1,
	  prog2/1,
	  prog3/1
	]
).

% N.B. La précédence de la virgule (pour les listes) est de 1000 (non-redéfinissable)
% elle est donc inférieure à celle des opérateurs MIL, OK.

%--- Exemples de programmes dans la syntaxe correspondante 

prog1(progMIL([a, b, q, r], [lire a , lire b , q := 0 , r := a ,
      tantque(r >= b, [q := q+1 , r := r-b]) , ecrire q , espace, ecrire r, ligne])
).

prog2(progMIL([n, m, p], [lire n , si( n =< 0, ecrire 0,  [m := n , p := 1 , 
		   tantque( m > 0, [p := p*m , m := m-1]), ecrire p, ligne])])
).

prog3(progMIL([a, b, t, q, r, d],
	[lire a,lire b,t:=b,
	tantque(t-a <= 0, [t:=2*t]),
	q:=0, r:=a, d:=t,
	tantque(0>b-d,
		[d:=d/2,
		si(r-d>=0,
			[r:=r-d, q:=2*q+1],
			[q:=2*q])
		]
	),
	ecrire q,
	espace,
	ecrire r,
	ligne ])
).
