//
// Type System 1
//
// This test checks that types are handled correctly. It was
// created for issue #238 "Segfault: Type checker fails to
// detect single negative numbers if record type is expected".
//

.type single_number = [ X:number ]
.type double_number = [ X:number, Y:number ]
.type triple_number = [ X:number, Y:number, Z:number ]

.type single_symbol = [ X:symbol ]
.type double_symbol = [ X:symbol, Y:symbol ]
.type triple_symbol = [ X:symbol, Y:symbol, Z:symbol ]

.decl SymbolRelation( X:symbol )
.decl NumberRelation( X:number )

.decl SingleNumberRelation( X:single_number )
.decl DoubleNumberRelation( X:double_number )
.decl TripleNumberRelation( X:triple_number )

.decl SingleSymbolRelation( X:single_symbol )
.decl DoubleSymbolRelation( X:double_symbol )
.decl TripleSymbolRelation( X:triple_symbol )

// Number Relation

NumberRelation(0).                     // no error
NumberRelation(1).                     // no error
NumberRelation(-1).                    // no error
NumberRelation(1+1).                   // no error
NumberRelation("1").                   // error
NumberRelation(nil).                   // error

NumberRelation([1]).                   // error
NumberRelation([-1]).                  // error
NumberRelation([1+1]).                 // error

NumberRelation([1, 1]).                // error
NumberRelation([-1, -1]).              // error
NumberRelation([1+1, 1+1]).            // error

NumberRelation([1, 1, 1]).             // error
NumberRelation([-1, -1, -1]).          // error
NumberRelation([1+1, 1+1, 1+1]).       // error

NumberRelation(["1"]).                 // error
NumberRelation(["1", "1"]).            // error
NumberRelation(["1", "1", "1"]).       // error

// Symbol Relation

SymbolRelation(0).                     // error
SymbolRelation(1).                     // error
SymbolRelation(-1).                    // error
SymbolRelation(1+1).                   // error
SymbolRelation("1").                   // no error
SymbolRelation(nil).                   // error

SymbolRelation([1]).                   // error
SymbolRelation([-1]).                  // error
SymbolRelation([1+1]).                 // error

SymbolRelation([1, 1]).                // error
SymbolRelation([-1, -1]).              // error
SymbolRelation([1+1, 1+1]).            // error

SymbolRelation([1, 1, 1]).             // error
SymbolRelation([-1, -1, -1]).          // error
SymbolRelation([1+1, 1+1, 1+1]).       // error

SymbolRelation(["1"]).                 // error
SymbolRelation(["1", "1"]).            // error
SymbolRelation(["1", "1", "1"]).       // error

// Single Number Relation

SingleNumberRelation(0).               // error
SingleNumberRelation(1).               // error
SingleNumberRelation(-1).              // error
SingleNumberRelation(1+1).             // error
SingleNumberRelation("1").             // error
SingleNumberRelation(nil).             // no error
SingleNumberRelation([1]).             // no error
SingleNumberRelation([-1]).            // no error
SingleNumberRelation([1+1]).           // no error
SingleNumberRelation(["1"]).           // error


// Double Number Relation

DoubleNumberRelation(0).               // error
DoubleNumberRelation(1).               // error
DoubleNumberRelation(-1).              // error
DoubleNumberRelation(1+1).             // error
DoubleNumberRelation("1").             // error
DoubleNumberRelation(nil).             // no error
DoubleNumberRelation([1, 1]).          // no error
DoubleNumberRelation([-1, -1]).        // no error
DoubleNumberRelation([1+1, 1+1]).      // no error
DoubleNumberRelation(["1", "1"]).      // error

// Triple Number Relation

TripleNumberRelation(0).               // error
TripleNumberRelation(1).               // error
TripleNumberRelation(-1).              // error
TripleNumberRelation(1+1).             // error
TripleNumberRelation("1").             // error
TripleNumberRelation(nil).             // no error
TripleNumberRelation([1, 1, 1]).       // no error
TripleNumberRelation([-1, -1, -1]).    // no error
TripleNumberRelation([1+1, 1+1, 1+1]). // no error
TripleNumberRelation(["1", "1", "1"]). // error

// Single Symbol Relation

SingleSymbolRelation(0).               // error
SingleSymbolRelation(1).               // error
SingleSymbolRelation(-1).              // error
SingleSymbolRelation(1+1).             // error
SingleSymbolRelation("1").             // error
SingleSymbolRelation(nil).             // no error
SingleSymbolRelation([1]).             // error
SingleSymbolRelation([-1]).            // error
SingleSymbolRelation([1+1]).           // error
SingleSymbolRelation(["1"]).           // no error

// Double Symbol Relation

DoubleSymbolRelation(0).               // error
DoubleSymbolRelation(1).               // error
DoubleSymbolRelation(-1).              // error
DoubleSymbolRelation(1+1).             // error
DoubleSymbolRelation("1").             // error
DoubleSymbolRelation(nil).             // no error
DoubleSymbolRelation([1, 1]).          // error
DoubleSymbolRelation([-1, -1]).        // error
DoubleSymbolRelation([1+1, 1+1]).      // error
DoubleSymbolRelation(["1", "1"]).      // no error

// Triple Symbol Relation

TripleSymbolRelation(0).               // error
TripleSymbolRelation(1).               // error
TripleSymbolRelation(-1).              // error
TripleSymbolRelation(1+1).             // error
TripleSymbolRelation("1").             // error
TripleSymbolRelation(nil).             // no error
TripleSymbolRelation([1, 1, 1]).       // error
TripleSymbolRelation([-1, -1, -1]).    // error
TripleSymbolRelation([1+1, 1+1, 1+1]). // error
TripleSymbolRelation(["1", "1", "1"]). // no error
