with debug
[prop.git] / prop-src / wam.pcc
blob27a3b035b048e532bdf3855a12c2bc8f19fb9b83
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 //  This file implements the helper routines for the 
4 //  constraint compiler, which is based (very, very, I mean, very) 
5 //  loosely on the Warren Abstract Machine (WAM).  
6 //
7 ///////////////////////////////////////////////////////////////////////////////
8 #include <iostream>
9 #include "basics.ph"
10 #include "wam.ph"
11 #include "type.h"
12 #include "ir.ph"
14 ///////////////////////////////////////////////////////////////////////////////
16 //  Instantiate the datatypes
18 ///////////////////////////////////////////////////////////////////////////////
19 instantiate datatype VarKind, WAM, Label, List<WAM>, List<Label>,
20                      Instness, Determinism;
22 ///////////////////////////////////////////////////////////////////////////////
24 //  Utility routines.
26 ///////////////////////////////////////////////////////////////////////////////
28 ///////////////////////////////////////////////////////////////////////////////
30 //  Dereference a determinism variable.
32 ///////////////////////////////////////////////////////////////////////////////
33 Determinism deref (Determinism det)
34 {  match while (det) { VAR_DET (d as ! UNKNOWN_DET): { det = d; } }
35    return det;
38 ///////////////////////////////////////////////////////////////////////////////
40 //  Dereference an instantiatedness variable.
42 ///////////////////////////////////////////////////////////////////////////////
43 Instness deref (Instness inst)
44 {  match while (inst) {  VARinst (i as ! NOinst): { inst = i; } }
45    return inst;
48 ///////////////////////////////////////////////////////////////////////////////
50 //  Pretty print the determinism.
52 ///////////////////////////////////////////////////////////////////////////////
53 std::ostream& operator << (std::ostream& f, Determinism d)
54 {  match (deref d)
55    { UNKNOWN_DET:  { f << "unknown"; }
56    | DET:          { f << "det"; }
57    | SEMI_DET:     { f << "semidet"; }
58    | MULTI_DET:    { f << "multidet"; }
59    | NON_DET:      { f << "nondet"; }
60    | FAIL_DET:     { f << "fail"; }
61    | ERROR_DET:    { f << "error"; }
62    | VAR_DET _:    { f << "???"; }
63    }  
64    return f;
67 ///////////////////////////////////////////////////////////////////////////////
69 //  Instantiateness analysis.
71 ///////////////////////////////////////////////////////////////////////////////
73 ///////////////////////////////////////////////////////////////////////////////
75 //  Determinism analysis.
77 ///////////////////////////////////////////////////////////////////////////////