% This software is licensed to you under the terms of a BSD-style license,
% see bsdlic.txt for details.
% This file demonstrates usage of the dotnot macros.
\input dotnot
\headline{\bf \title}
\def\title{\centerline{Usage of dotnot}}
\def\out{\hbox{\it out:\/}}

The greatest common denominator:
\bblock
\cofl{m > 0 \land n > 0}
\[\glocon m, n; \virvar gcd
  ; \privar i, j
  ; i \vir int, j \vir int \:= m, n
  ; \do i \not= j \->\IF i > j \-> i \:= i - j
                     \| j > i \-> j \:= j - i
                     \FI 
    \od
  ; gcd \vir int \:= i
\] \co{gcd = \gcd.(n, m)}
\eblock
This is the outcome of p0:
\bblock
\out\;\[\glocon n, q; \virvar d
\cofl{0 \le n < q}
; \privar u, v
; d \vir int \array, u \vir int, v \vir int \:= (1), 10, n*10
; \do u \div 2 < v  \mand  u \le q \->\&%
                                  d:hiext.\bigl((v + u \div 2 - 1) \div q\bigr)
                                ; u, v \:= 10*u, (v - d.high*q)*10 \decind
   \od
; \IF u \div 2 < v \-> d:hiext.\bigl((v + q \div 2) \div q\bigr)%
  \| v \le u \div 2 \-> skip   % use `%' to combine several input lines
                                  % into one output line
  \FI
\] \co{\hbox{$d$ contains the decimal digits of $n/q$}}
\eblock
An alternative program to compute the greatest common denominator:
\bblock
\[\glocon m, n; \virvar gcd
   ;\privar i, j
   ;i \vir int, j \vir int \:= m, n
   ;\do i > j \-> i \:= i - j
     \| i < j \-> j \:= j - i
    \od
   ;gcd \vir int \:= (i + j) \div 2
\]
\eblock
This program computes the next higher permutation of c.
\bblock
\[ \glovar c; \privar i,j
  ; i\vir int \:= c.hib -1;\;\do c.i \ge c.(i+1) \-> i \:= i - 1\od
  ; j\vir int \:= c.hib;\;\do c.j \le c.i \-> j \:= j-1 \od
  ; c:swap.(i,j)
  ; i \:= i+1; j \:= c.hib;
  ; \do i < j \-> c:swap.(i,j); i,j \:= i+1,j-1 \od
\]
\eblock
And this is the famous Dutch flag program:
\bblock
\[ \glovar buck; \glocon n; \privar r, w, b
 ; r \vir int, w \vir int, b\vir int \:= 1, n,n
 ; \do w \ge r \-> \[ \glovar buck, r, w, b; \pricon col
                ; col \vir colour \:= buck.w 
                ; \IF col = red \-> buck:swap.(r,w); r := r+1
		   \| col = white \-> w \:= w-1
		   \| col = blue \-> buck:swap.(w,b); w,b \:= w-1, b-1
		  \FI 
	       \]
   \od
\]
\eblock
\bye
