private with Ada.Strings.Unbounded; package Predicate2.Source_Reference is type Object is tagged private; subtype Source_Reference is Object; function "<" (Left, Right : Object) return Boolean; Undefined : constant Object; private use Ada.Strings.Unbounded; type Object is tagged record Line : Natural; Column : Natural; Filename : Unbounded_String; end record with Dynamic_Predicate => Filename /= Null_Unbounded_String; function "<" (Left, Right : Object) return Boolean is (Left.Filename < Right.Filename or else (Left.Filename = Right.Filename and then Left.Line < Right.Line)); Undefined : constant Object := (0, 0, To_Unbounded_String ("@")); end Predicate2.Source_Reference;