%%% Laplace's equation in two dimensions 
%%% (taken from S. Michaylov's Ph.D. dissertation)
%%% Author: Roberto Virga

%use equality/rationals.

%% equality
== : rational -> rational -> type.  %infix none 1000 ==.

id : X == X.

%% lists
list : type.

nil : list.

,   : rational -> list -> list.  %infix right 100 ,.

av : list -> list -> list -> type.

av0 : av (_ , _ , nil) (_ , _ , nil) (_ , _ , nil).
av1 : av (TL , T , TR , T1) (ML , M , MR , T2) (BL , B ,  BR , T3)
        <- B + T + ML + MR - 4 * M == 0
        <- av (T , TR , T1) (M , MR , T2) (B , BR , T3).

%% lists of lists
llist : type.

lnil : llist.
;    : list -> llist -> llist.  %infix right 50 ;.

%% solve Laplace equation
laplace : llist -> type.

l0 : laplace (_ ; _ ; lnil).
l1 : laplace (H1 ; H2 ; H3 ; T)
       <- av H1 H2 H3
       <- laplace (H2 ; H3 ; T).
