Technical Report 97-12
Department of Computer Science
University of British Columbia
28 Oct 1997
Appendix A: Full Specification
Appendix B: Full Analysis results
Appendix C: A Brief Introduction to the S Notation
The separation minima provides guidance to air traffic controllers managing the region of oceanic airspace between Europe and North America. It is also used as the basis for the development of software based systems that support the management of air traffic in the NAT region. For example, it would be used during the planning of a flight from New York to London to check whether the route is free from separation conflicts with other aircraft expected to be in the NAT region at the same time.
The source document for our formalization is an informal specification that has been scrutinized by the NATSPG (NAT Systems Planning Group) members who are air traffic control (ATC) specialists from the NAT countries, and most of them maintain and use automated systems that implement these rules.
Our formalization and analysis effort directly involved an ATC domain expert (not just formal methods experts) in the process of developing and analyzing a formal representation of this complex real description. The two objectives for formalizing these separation rules were:
Our formal representation of these separation minima is given in a mixture of a tabular style of specification and a textual predicate logic notation called S [JDD94]. This effort required itemizing the variety of English phrases used to describe various conditions to yield a "dictionary" of primitives. These primitives are used in tables to specify the combinations of conditions which result in particular outcomes. It is possible to analyze this formal representation so we are able to determine the scenarios that are either not covered by a table, or are covered by the default case (completeness analysis). We also examined the consistency and symmetry of the tables.
In this project, considerable emphasis was placed on the readability of the specification. Consequently, tools were developed to create an on-line, top-down presentation of the specification with cross-referencing links. This technical report is a printout from a web browser. However the formal specification and analysis results do not necessarily have to be given in this format.
This report presents the complete specification along with an introduction to the formal description technique used for this specification. The full results of the analysis are also included. Details of the technique used to carry out the analysis can be found in [DJP97].
The ability to parse this separation minima into a mathematical representation is valuable for several reasons. For instance, software tools based on formal logic can be used to perform a variety of validation checks on the mathematical representation. It may also be possible to use this mathematical representation as input to software tools which automatically generate software components for a software system based on the NAT separation minima.
In this section, we describe the notation used in this specification and briefly introduce the analysis carried out.
WithinOppDirNoLongSepPeriod(A:flight,B:flight,t:time) := let timePeriod := OppDirNoLongSepPeriod(A,B) in (StartTime(timePeriod) <= t) AND (t <= EndTime(timePeriod));and tables such as:
1 | 2 | 3 | 4 | Default | |||
---|---|---|---|---|---|---|---|
1 | FlightLevel (A) | __ <= 280 | . | __ > 450 | __ > 450 | ||
2 | FlightLevel (B) | . | __ <= 280 | __ > 450 | __ > 450 | ||
3 | IsSupersonic (A) | . | . | __=T | . | ||
4 | IsSupersonic (B) | . | . | . | __=T | ||
VerticalSeparationRequired (A,B) | 1000 | 1000 | 4000 | 4000 | 2000 |
The textual parts of the formal specification of the separation minima found in Appendix A are easily distinguished in this document from unformalized text by the use of "typewriter font" for the formalized text, e.g.,
WithinOppDirNoLongSepPeriod(A:flight,B:flight,t:time) := ...The formalized text is written in a formal notation called "S". Although based on formal logic, much of the syntax of this notation is similar to that of well-known programming languages, e.g., "if ... then ... else ...".
The tabular parts of the formal specification of the separation minima are also easy to recognize by the graphical presentation of these tables in this document. The row entries within these tables is based on the syntax of S.
This section gives a brief description of the tabular style of specification. Appendix C provides an description of the "S" notation focusing on the S constructs used in this document.
The formal specification of the separation minima is presented in this document as a sequence of declarations and definitions. Many elements of the formal specification are defined hierarchically in terms of other formally specified elements. For instance, the "top- level" element of this hierarchy is the predicate "AreSeparated"; it is defined in terms of a number of predicates and functions such as "VerticalSeparationRequired", "LatitudeEquivalent", "LateralSeparation RequiredInDegrees", and "LateralSeparation RequiredInMiles". The order of the declarations and definitions for these elements, as they appear in the specification, is approximately "top down" beginning with top level concepts and refining these successively into lower level concepts. Figure 1 in Appendix A shows the hierarchy of definitions for our formal specification of the NAT separation minima.
The bottom (or "leaf") level of definitions in this figure are defined in terms of primitive elements. These primitive elements include objects such as a "flight". They also include terms which correspond to attributes or properties of objects as well as relationships between objects. An example of a primitive term is the "FlightLevel" of a flight. These terms are declared rather than defined. As primitives, they identify the lowest level of abstraction used to specify the NAT separation minima. It can be assumed that the meaning of these primitives is obvious to the intended audience of this specification, namely, individuals familiar with aircraft separation.
A predicate table specifies a condition which is true or false depending on the values of other conditions. Each column of a table represents a set of these subconditions that, when taken together, describe one case. For example, the following table,
1 | 2 | 3 | 4 | ||
---|---|---|---|---|---|
1 | a | __=T | __=T | __=F | __=F |
2 | b | __=T | __=F | __=T | __=F |
P1 (a, b) | T | T | F | F |
defines a predicate "P1" in terms of two input conditions, "a" and "b". The constants "T" and "F" are used to represent "true" and "false" respectively. An entry in a row such as "__ = T" represents the condition resulting from filling in the blank with the label of the row (an input condition). For example, the entry in row 2, column 3 is "b= T". Each of the four columns corresponds to a separate case. For instance, column 2 specifies that the predicate "P1" is true if condition "a" is true and "b" is false. The value of "P1" for this particular combination of input conditions is indicated by the "T" in the last row of column 2.
The tabular specification of a condition in this manner is an alternative to a textual representation. For instance, an equivalent representation of the condition "P1" using S notation is:
P1 := if ((a = T) AND (b = T)) then T else if ((a = T) AND (b = F)) then T else if ((a = F) AND (b = T)) then F else F;
The above example table is "complete" in the sense that every possible combination of the values of the input conditions is represented explicitly by one of the columns in the table. In this case, there are just four possible combinations. However, for more complex tables it is not practical to write out every possible combination of input conditions. Fortunately, the specification notation used in this document provides several mechanisms for reducing the size of tables without changing their meaning.
One such mechanism is the use of "." in a cell of a table which means "don't care" - i.e., the input condition for this row can be any value. This mechanism often allows two or more columns of a table to be merged into one column. For example, Table 2 given above for "P1" can be simplified as follows without changing its meaning:
1 | 2 | 3 | ||
---|---|---|---|---|
1 | a | __ = T | __ = F | __ = F |
2 | b | . | __ = T | __ = F |
P1 (a, b) | T | F | F |
Column 1 of Table 3 corresponds to Columns 1 and 2 of Table 2. It is possible to merge these columns of Table 2 because the only difference between them is the value of "b".
Another mechanism used in this specification document to reduce the size of tables is the addition of an extra column at the right hand side of the table which specifies the default value of the predicate. This is the value of the predicate if none of the other columns match the table inputs. For example, an even simpler specification of the condition "P1" is given by the following table:
1 | Default | |||
---|---|---|---|---|
1 | a | __ = T | ||
2 | b | . | ||
P1(a,b) | T | F |
1 | 2 | Default | |||
---|---|---|---|---|---|
1 | x <= 100 | __=T | __=F | ||
2 | 100 < x | __=F | __=T | ||
3 | a | __=F | __=T | ||
P2 (x,a) | T | T | F |
can be reduced in size by taking advantage of the fact that Rows 1 and 2 are related. In particular, the value in each cell of Row 1 is the logical opposite of the corresponding cell in Row 2 because the conditions labelling the rows are mutually exclusive. These two rows can be merged by using parameterized expressions in a single row other than just "__ = T" or "__ = F". These two rows can be merged by using parameterized expression in the cells of a single row where the parameter corresponds to the value of the input variable "x":
1 | 2 | Default | |||
1 | x | __ <= 100 | 100 < __ | ||
2 | a | __ = F | __ = T | ||
P2 (x, a) | T | T | F |
Each cell of the first row of the above table (i.e., the row labelled by "x" on the left hand side of the table) contains either "_ <= 100" or "100 < _". The blank, i.e., "_" stands for the value of the input variable identified at the left hand side of the row, i.e., "x".
The textual parts of the tables which appear in this document are based on the S notation. The only extension to the S syntax used within the tables is the use of "_" to stand for the value of the input variable.
1 | 2 | 3 | Default | |||
---|---|---|---|---|---|---|
1 | x | __ <= 100 | 100 < __ | 100 < __ | ||
2 | y | __ < 55 | __ = 55 | 55 < __ | ||
3 | a | __=T | . | __=F | ||
F1(x,y,a) | 20 | 40 | 60 | 30 |
specifies a function "F1" that, for instance, evaluates to "40" when "x" is greater than "100" and "y" is exactly "55". Notice that the input variables are given as parameters to the function specification unless they are global constants.
The equivalent textual representation for "F1" is :
F1(x,y,a) := if ((x <= 100) AND (y < 55) AND (a = T)) then 20 else if ((100 < x) AND (y = 55)) then 40 else if ((100 < x) AND (55 < y) AND (a = F)) then 60 else 30;
"AllOf [A;B] HavePartOfRouteINMNPSAirspace "
instead of
"HavePartOfRouteINMNPSAirspace (A) AND
HavePartOfRouteINMNPSAirspace (B)"
Similarly the expression "AtLeastOneOf [A;B] P" is equivalent to "P (A) OR P (B)".
forall (A:flight). NOT (IsLevel A AND InCruiseClimb A);
These assumptions helped reduce the results of the analysis by eliminating some impossible scenarios. They are specified using predicate logic because each assumption is fairly simple.
It is useful to check whether a tabular specification is "complete" in the sense that any possible combination of inputs given by the row entries corresponds to at least one of the columns in the table. For instance, the table,
1 | 2 | 3 | ||
---|---|---|---|---|
1 | a | __=T | __=T | __=F |
2 | b | __=T | __=F | __=T |
P3 (a, b) | T | T | T |
is not complete in the sense that it does not include the case when "a" and "b" are both false. The table,
1 | 2 | 3 | ||
---|---|---|---|---|
1 | x | __ < 100 | 100 < __ | 100 < __ |
2 | y | __ < 55 | __ = 55 | 55 < __ |
3 | a | __=T | . | __=F |
F2(x,y,a) | 20 | 40 | 60 |
is also incomplete because it omits the cases when "x" is equal to "100".
From a logical perspective, it is not necessarily an error if a table is found to be incomplete. It is sometimes desirable to only partially specify a condition or function. However, it would be common in a specification methodology to disallow partial specifications -- which means, in this case, to require every table to be complete.
A table is guaranteed to be complete if it contains a "Default" column. However, it is possible that more cases than intended fall into the "Default" column. When a "Default" column is used in a tabular specification, it is desirable to enumerate the cases included in that column as part of the validation effort.
1 | 2 | 3 | ||
---|---|---|---|---|
1 | x | __ < 100 | 100 < __ | 100 < __ |
2 | y | __ < 55 | 55 < __ | 55 < __ |
3 | a | __=T | . | __=F |
F3(X,Y,a) | 20 | 40 | 60 |
is not consistent because it specifies two different values, "40" and "60" for the same case, namely, when "x" is greater than 100, "y" is greater than 55 and "a" is false.
Note that a predicate table can never be inconsistent because all of its columns have the same return value for the function, i.e. "T".
Initially fusion typechecks the specification to ensure that the terms are all used consistently and that every object refered to is defined or declared. Then fusion can check the completeness, consistency and symmetry of individual tables.
Completeness checking returns a list of the cases covered by the default column, or those not covered if there is no default column. The tool attempts to shorten the list by determining how output cases can be combined through the use of "don't care" (DC) values. This list of cases can be reviewed manually to determine if these cases are intended to have the default value. While this involves manual effort, the processing performed by fusion streamlines the review process and potentially improves its thoroughness.
Consistency checking returns pairs of columns which return different values for the function but overlap in the set of input values that can satisfy the column. The tool also returns the combination of input values that can satisfy both columns.
If it can not fully determine that it is symmetric, symmetry checking returns a list of conditions which must be satisfied for the table to be symmetric. The addition of some environmental constraints about the symmetry of primitive terms helps this analysis.
The formal specification of the separation minima includes 15 tables which we can analyze for completeness, consistency and symmetry. The results for each of these checks are summarized in the following table.
Table | # of Rows | # of Cols | Type of Table, Default Col | Completeness (# of missing or default cases) | Consistency (# of overlapping cases) | Definitely Symmetric ? |
---|---|---|---|---|---|---|
VerticalSeparationRequired | 4 | 4 | F,D | 4 | 0 | YES |
"LateralSeparation RequiredInDegrees" | 8 | 4 | F,D | 16 | 4 | YES |
"LateralSeparation RequiredInMiles" | 8 | 4 | F,D | 16 | 4 | YES |
LatitudeEquivalent | 5 | 6 | P | 17 | 0 | NO |
LongSameDirSepRequired | 2 | 2 | F,D | 1 | 0 | NO |
"OppDir NoLongSepPeriod" | 2 | 2 | F,D | 1 | 0 | NO |
"ssOppDir NoLongSepPeriod" | 1 | 2 | F | 0 | 0 | NO |
ssSameDirLongSep | 4 | 2 | F,D | 3 | 0 | YES |
ssSubcondition | 4 | 2 | P | 4 | 0 | YES |
"turbojetSameDir LongSep" | 2 | 4 | F | 0 | 0 | NO |
"turbojetOppDir NoLongSepPeriod" | 2 | 4 | F | 0 | 0 | NO |
"MNPSSameDir LongSep" | 3 | 5 | F,D | 3 | 0 | NO |
WATRSCondition | 6 | 2 | P | 8 | 0 | YES |
"genSameDir LongSep" | 6 | 3 | F,D | 5 | 0 | NO |
otherSameDirLongSep | 3 | 2 | F,D | 2 | 1 | YES |
"F" means function table. "P" means predicate table. "D" means there is a default column in the function table. The default column of predicate tables is always F for false. The number of columns does not include the default column in this count.
For some tables there are a great number of cases covered by the default column but review by our domain expert did not find any errors in the specification from these results.
The table "otherSameDirLongSep" (Appendix A, Table 25) specifies the number of minutes that must exist between two aircraft (that are not both turbojet or both supersonic) flying in the same direction for them to be considered longitudinally separated. The checker identified that, for the case where two aircraft have reported over a common navigation point, are on the same or diverging tracks, and are both on a particular set of routes that have special criteria, the specification is ambiguous as to whether there should be 15 or 20 minutes of separation between them.
The other two tables with inconsistencies describe requirements for lateral separation. These two tables, "LateralSeparation RequiredInDegrees" and "LateralSeparation RequiredInMiles" are the same except that the first returns a value in degrees of latitude and the second returns a value in miles. These tables have eight rows and four columns. The inconsistent cases involve special provisions for particular routes that overlap with the more general criteria. The results clearly reveal cases in the official specification that are ambiguous as to the amount of lateral separation required between aircraft.
forall (A:flight) (B:flight). ReportedOverCommonPoint(A,B) = ReportedOverCommonPoint(B,A);When symmetry analysis can not completely determine if a table is symmetric it returns conditions that if satisfied would mean the table is symmetric.
If the return values of a function table are not concrete values, the tool states assumptions about the symmetry of the return values of the function.
Symmetry checking of the "LatitudeEquivalent" table points out that in one row a condition is written "x < 58" and in another row it is written "58 > x". The analysis carried out by the tool is to a large degree based on the syntactical equivalence of primitive terms so it is not able to show these terms are equal. However if the table is amended to use only one form of this expression, the tool would be able to show the table is symmetric.
We believe that this formalization of these separation minima is readable without extensive training in the use of formal specification techniques. A number of potential ambiguities in the source documents were identified and resolved as part of the formalization process. The formal specification contains 15 tables, 18 definitions, 43 uninterpreted constants, 2 uninterpreted types, 1 defined type (location), and 1 type abbreviation (time).
The formal specification technique demonstrated by this example formalization of the NAT Separation Minima bears some similarity with the use of pseudo-code as a means of specification. One common element is the use of a fixed syntax that is potentially parseable by software tools. But unlike pseudo code, the formal specification technique used here provides constructs necessary to avoid the unintentional embedding of design or implementation constraints in the specification. For instance, it does not constrain the order in which conditions are to be evaluated when determining if the condition "AreSeparated" is satisfied. It also does not require full descriptions to be given for all terms used in the specification. The use of uninterpreted constants allows the formalization to maintain a suitable level of abstraction for the separation minima.
The formal specification and analysis techniques demonstrated by example in this report are intended to be widely applicable. We suggest that this approach would be very useful in the specification and analysis of systems with combinations of conditions that produce different outcomes that involve considerable logical complexity. In an informal natural language specification these are conditions that involve considerable use of words such as "or" and "and". As demonstrated here, automated analysis of these specifications, such as the 45 checks carried out in this work, can quickly reveal problems in the specification that are not easily discovered through manual review.
As noted in the introduction of Appendix A, the formalization of the NAT Separation Minima does not include the explanatory text found in the source documents. An interesting next step in the development of this work would be to prototype a new version of the source document incorporating the formalization of the minima based on the approach documented in this report.
[DJP97] Nancy A. Day, Jeffrey J. Joyce, and Gerry Pelletier. Formalization and Analysis of the Separation Minima for Aircraft in the North Atlantic Region. In Lfm97: Fourth NASA Langley Formal Methods Workshop, NASA Conference Publication 3356, compiled by C. Michael Holloway and Kelly J. Hayhurst, September 1997.
[HC95] D.N. Hoover and Zewei Chen. Tablewise, a Decision Table Tool. In Proceedings of the Ninth Annual Conference on Computer Assurance (COMPASS'95), 97-108, Gaithersburg, MD, June 1995.
[HJL96] Constance L. Heitmeyer, Ralph D. Jeffords, and Bruce G. Labaw. Automated consistency checking of requirements specifications. ACM Transactions on Software Engineering and Methodology, 5(3):231-261, July 1996.
[HL96] Mats P.E. Heimdahl, and Nancy G. Leveson. Completeness and consistency in hierarchical state-based requirements. IEEE Transactions on Software Engineering, 22(6):363-377, June 1996.
[JDD94] J. Joyce, N. Day, and M. Donat. S: A machine readable specification notation based on higher order logic. In 7th International Workshop on Higher Order Logic Theorem Proving and Its Applications, 285-299, Valletta, Malta, September 1994.
[LHHR94] Nancy G. Leveson, Mats P.E. Heimdahl, Holly Hildreth, and Jon D. Reese. Requirements specification for process-control systems. IEEE Transactions on Software Engineering, 20(9):684-707, September 1994.
[P92] David Lorge Parnas. Tabular representations of relations. Technical Report 260, Communications Research Laboratory, Faculy of Engineering, McMaster University, October 1992.
[P91] L.C. Paulson. ML for the Working Programmer. Cambridge University Press, Cambridge, 1991.
The formalized version of the specification presented here does not include as much explanatory text as would be found in a full specification document. In its current form, this document should be seen as a companion document to the official specification.
This does not represent the views of MacDonald Dettwiller (MDA) or Hughes International Airspace Management Systems. The document that formed the basis for this formal specification is not proprietary.
AreSeparated(A:flight,B:flight,t:time) := /* A and B are vertically separated based on flight level */ (ABS(FlightLevel A - FlightLevel B) > VerticalSeparationRequired(A,B)) OR /* A and B are laterally separated based on either position in degrees of latitude or position in miles */ (if (LatitudeEquivalent(A,B)) then (ABS(LateralPositionInDegrees A - LateralPositionInDegrees B) > "LateralSeparation RequiredInDegrees" (A,B)) else (ABS(LateralPositionInMiles A - LateralPositionInMiles B) > "LateralSeparation RequiredInMiles" (A,B))) OR /* A and B are longitudinally separated based on time depending on whether the two flights are in the approximate same or opposite direction */ (if (AngularDifferenceGreaterThan90Degrees (RouteSegment A, RouteSegment B)) then /* opposite direction */ NOT (WithinOppDirNoLongSepPeriod(A,B,t)) else /* same direction */ ABS(TimeAtPosition A - TimeAtPosition B) > LongSameDirSepRequired(A,B));Note that identifiers within quotation marks have no special meaning. The use of quotation marks allows identifiers to contain white space.
1 | 2 | 3 | 4 | Default | |||
---|---|---|---|---|---|---|---|
1 | FlightLevel (A) | __ <= 280 | . | __>450 | __>450 | ||
2 | FlightLevel (B) | . | __ <= 280 | __ > 450 | __>450 | ||
3 | IsSupersonic (A) | . | . | __=T | . | ||
4 | IsSupersonic (B) | . | . | . | __=T | ||
VerticalSeparationRequired (A,B) | 1000 | 1000 | 4000 | 4000 | 2000 |
Routes1 := {(USA,BDA);(CAN,BDA);(IberianPeninsula, Azores);
(Iceland,Scandinavia);(Iceland, UnitedKingdom)};
Routes2 := {(USA,Caribbean);(CAN,Caribbean);(BDA, Caribbean)};
The following predicate checks whether the departure and destination of a flight fall within a set of routes:
IsOnRoute (R:(location#location)set) (X:flight) :=
((RouteDeparture (X), RouteDestination (X)) In R) OR
((RouteDestination (X), RouteDeparture (X)) In R);
The following predicate determines whether the flightlevel of an aircraft
is above 275:
FlightLevelAbove275 (X:flight) := FlightLevel X > 275;
The rules for lateral separation are:
1 | 2 | 3 | 4 | Default | |||
---|---|---|---|---|---|---|---|
1 | AllOf [A;B] IsOutsideMNPSAirspace | __=T | __=T | . | . | ||
2 | AllOf [A;B] (IsOnRoute (Routes1)) | __=T | . | . | . | ||
3 | AllOf [A;B] (IsOnRoute (Routes2)) | . | __=T | . | . | ||
4 | AllOf [A;B] IsWestOf55W | . | __=T | . | . | ||
5 | AllOf [A;B] IsSupersonic | . | . | __=T | . | ||
6 | AllOf [A;B] FlightLevelAbove275 | . | . | __=T | . | ||
7 | AllOf [A;B] MeetMNPS | . | . | . | __=T | ||
8 | AllOf [A;B] HavePartOfRouteInMNPSAirspace | . | . | . | __=T | ||
"LateralSeparation RequiredInDegrees" (A,B) | 1.5 | 1.5 | 1 | 1 | 2 |
As prescribed by the "AreSeparated" predicate, sometimes it is necessary to calculate the lateral separation required in miles, rather than degrees. The result in miles is given by the following table:
1 | 2 | 3 | 4 | Default | |||
---|---|---|---|---|---|---|---|
1 | AllOf [A;B] IsOutsideMNPSAirspace | __=T | __=T | . | . | ||
2 | AllOf [A;B] (IsOnRoute (Routes1)) | __=T | . | . | . | ||
3 | AllOf [A;B] (IsOnRoute (Routes2)) | . | __=T | . | . | ||
4 | AllOf [A;B] IsWestOf55W | . | __=T | . | . | ||
5 | AllOf [A;B] IsSupersonic | . | . | __=T | . | ||
6 | AllOf [A;B] FlightLevelAbove275 | . | . | __=T | . | ||
7 | AllOf [A;B] MeetMNPS | . | . | . | __=T | ||
8 | AllOf [A;B] HavePartOfRouteInMNPSAirspace | . | . | . | __=T | ||
"LateralSeparation RequiredInMiles" (A,B) | 90 | 90 | 60 | 60 | 120 |
In this formalization, the primitive ``HavePartOfRouteInMNPSAirspace'' is true for a flight that has a portion of its route in MNPS airspace. In particular, it only applies to segments of the flight's route that are in, directly above, or directly below MNPS airspace.
Conversely we assume that ``IsOutsideMNPSAirspace'' is true for a flight which has no portion of route in MNPS airspace or for those segments of an MNPS flight which are below the level immediately below MNPS airspace and to the segments above the level immediately above MNPS airspace.
The following table determines whether the rules that result in degrees (Table 13) or the rules that result in miles (Table 14) are used:
1 | 2 | 3 | 4 | 5 | 6 | Default | |||
---|---|---|---|---|---|---|---|---|---|
1 | "RouteSegment Degrees" A | __<=58 | . | (58<__) AND (__<70) | . | (70<=__) AND (__<=80) | . | ||
2 | "RouteSegment Degrees" B | . | __<=58 | . | (__>58) AND (__<70) | . | (70<=__) AND (__<=80) | ||
3 | AllOf [A;B] "LatChange Per10DLong LessThanOrEq3" | __=T | __=T | . | . | . | . | ||
4 | AllOf [A;B] "LatChange Per10DLong LessThanOrEq2" | . | . | __=T | __=T | . | . | ||
5 | AllOf [A;B] "LatChange Per10DLong LessThanOrEq1" | . | . | . | . | __=T | __=T | ||
LatitudeEquivalent (A,B) | T | T | T | T | T | T | F |
Longitudinal Separation does not exist between flights of opposing direction
during a certain time period.
WithinOppDirNoLongSepPeriod(A:flight,B:flight,t:time) :=
let timePeriod := "OppDir NoLongSepPeriod"(A,B) in
(StartTime(timePeriod) <= t) AND (t <= EndTime(timePeriod));
1 | 2 | Default | |||
---|---|---|---|---|---|
1 | AllOf [A;B] IsSupersonic | __=T | __=F | ||
2 | AllOf [A;B] IsTurbojet | . | __=T | ||
LongSameDirSepRequired (A,B) | ssSameDirLongSep (A,B) | "turbojetSameDir LongSep" (A,B) | otherSameDirLongSep (A,B) |
1 | 2 | Default | |||
---|---|---|---|---|---|
1 | AllOf [A;B] IsSupersonic | __=T | __=F | ||
2 | AllOf [A;B] IsTurbojet | . | __=T | ||
"OppDir NoLongSepPeriod" (A,B) | "ssOppDir NoLongSepPeriod" (A,B) | "turbojetOppDir NoLongSepPeriod" (A,B) | "otherOppDir NoLongSepPeriod" (A,B) |
1 | 2 | ||
---|---|---|---|
1 | ReportedOverCommonPoint(A,B) | __=T | __=F |
"ssOppDir NoLongSepPeriod" (A,B) | (ept(A,B),ept(A,B)+10) | (ept(A,B)-15,ept(A,B)+15) |
The following table shows the longitudinal separation requirements for same direction supersonic flights. Same direction here applies to route segments with an intersection angle of 90 degrees or less.
1 | 2 | Default | |||
---|---|---|---|---|---|
1 | ssSubcondition(A,B) | __=T | __=T | ||
2 | "SameOr Diverging Tracks"(A,B) | __=T | __=T | ||
3 | ReportedOverCommonPoint(A,B) | __=T | . | ||
4 | "Appropriate TimeSep AtCommon Point"(A,B) | . | __=T | ||
ssSameDirLongSep(A,B) | 10 | 10 | 15 |
1 | 2 | Default | |||
---|---|---|---|---|---|
1 | AllOf [A;B] IsLevel | __=T | . | ||
2 | SameMachNumber (A,B) | __=T | . | ||
3 | SameType(A,B) | . | __=T | ||
4 | AllOf [A;B] InCruiseClimb | . | __=T | ||
ssSubcondition(A,B) | T | T | F |
1 | 2 | 3 | 4 | ||
---|---|---|---|---|---|
1 | MNPSCondition (A,B) | __=T | __=F | __=T | __=F |
2 | WATRSCondition (A,B) | __=T | __=T | __=F | __=F |
"turbojetSameDir LongSep" (A,B) | MinAll (A,B) | Min { "WATRSSameDir LongSep" (A,B); "genSameDir LongSep" (A,B)} | Min { "MNPSSameDir LongSep" (A,B); "genSameDir LongSep" (A,B)} | "genSameDir LongSep" (A,B) |
This table relies on the following definition which takes the minimum value of all the possible calculations:
MinAll(A,B) :=
Min {
"MNPSSameDir LongSep"(A,B);
"WATRSSameDir LongSep"(A,B);
"genSameDir LongSep"(A,B)};
The separation period for which turbojet aircraft flying in opposing directions are not considered separated also depends on multiple calculations as given by the following table:
1 | 2 | 3 | 4 | ||
---|---|---|---|---|---|
1 | MNPSCondition (A,B) | __=T | __=F | __=T | __=F |
2 | WATRSCondition (A,B) | __=T | __=T | __=F | __=F |
"turbojetOppDir NoLongSepPeriod" (A,B) | UnionAll (A,B) | UnionOfRange { "WATRSOppDir NoLongSepPeriod" (A,B); "genOppDir NoLongSep Period" (A,B)} | UnionOfRange { "MNPSOppDir NoLongSepPeriod" (A,B); "genOppDir NoLongSep Period" (A,B)} | "genOppDir NoLongSep Period" (A,B) |
The resulting time period in which the aircraft do not have longitudinal separation is the minimum of all the start times given by the relevant calculations and the maximum of all the possible end times, as given by the following two definitions:
UnionOfRange (periods) :=
(MinEarliestTime (periods), MaxLatestTime (periods));
UnionAll (A,B) :=
let periods :=
{"MNPSOppDir NoLongSepPeriod"(A,B);
"WATRSOppDir NoLongSepPeriod"(A,B);
"genOppDir NoLongSep Period"(A,B)} in
(MinEarliestTime (periods), MaxLatestTime (periods));
MNPSCondition(A,B) :=
(AllOf [A;B] MeetMNPS ) AND
(AllOf [A;B] HavePartOfRouteInMNPSAirspace );
The time period during which turbojet aircraft on opposing tracks do not have separation is the same as that given for supersonic aircraft.
"MNPSOppDir NoLongSepPeriod"(A,B) := "ssOppDir NoLongSepPeriod"(A,B);
The following table defines the separation required
in minutes for turbojet aircraft flying in the same
direction using the MNPS calculation.
1 | 2 | 3 | 4 | 5 | Default | |||
---|---|---|---|---|---|---|---|---|
1 | "Appropriate TimeSep AtCommon Point" (A,B) | __=T | __=T | __=T | __=T | __=T | ||
2 | "SameOr Diverging Tracks" (A,B) | __=T | __=T | __=T | __=T | __=T | ||
3 | Mach (FirstAircraft (A,B)) - Mach (SecondAircraft (A,B)) | (__>0.06) | ((0.06>=__) AND (__>0.05)) | ((0.05>=__) AND (__>0.04)) | ((0.04>=__) AND (__>0.03)) | ((0.03>=__) AND (__>0.02)) | ||
"MNPSSameDir LongSep" (A,B) | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 2 | Default | |||
---|---|---|---|---|---|
1 | AllOf [A;B] EnterWATRSAirspaceAtSomeTime | __=T | __=T | ||
2 | AllOf [A;B] IsWestOf60W | __=T | . | ||
3 | AllOf [A;B] InWATRSAirspace | . | __=T | ||
4 | AllOf [A;B] MachTechniqueUsed | __=T | __=T | ||
5 | AllOf [A;B] OnPublishedRoute | __=T | __=T | ||
6 | "SameOr Diverging Tracks" (A,B) | __=T | __=T | ||
WATRSCondition(A,B) | T | T | F |
A completed specification should provide detailed specifications of
the same and opposite direction longitudinal separation required
in the WATRS airspace. However, due to problems in the WATRS rules in
the source document, we could not proceed with an accurate
definition. Our interim solution is to introduce these constants
as uninterpreted primitives.
"WATRSSameDir LongSep" : (flight#flight) -> num;
"WATRSOppDir NoLongSepPeriod": (flight#flight) -> (time#time);
"genOppDir NoLongSep Period"(A,B) := "MNPSOppDir NoLongSepPeriod"(A,B);
The general calculation for the separation required by turbojet aircraft flying in the same direction is given by the following table:
1 | 2 | 3 | Default | |||
---|---|---|---|---|---|---|
1 | "SameOr Diverging Tracks" (A,B) | __=T | __=T | __=T | ||
2 | AllOf [A;B] MachTechniqueUsed | __=F | __=T | __=T | ||
3 | AtLeastOneOf [A;B] InCruiseClimb | __=F | __=F | __=F | ||
4 | ReportedOverCommonPoint (A,B) | __=T | . | . | ||
5 | "Appropriate TimeSep AtCommon Point" (A,B) | . | __=T | __=T | ||
6 | Mach (FirstAircraft(A,B)) - Mach (SecondAircraft(A,B)) | . | (__>0.6) | (0.6>=__) AND (__>0.3) | ||
"genSameDir LongSep" (A,B) | 15 | 5 | 10 | 20 |
"otherOppDir NoLongSepPeriod" (A,B) := "genOppDir NoLongSep Period"(A,B);
There is a special case for certain routes:
Routes3 :=
{(USA,Caribbean);(CAN,Caribbean);
(BDA, Caribbean);(USA,BDA); (CAN,BDA)};
1 | 2 | Default | |||
---|---|---|---|---|---|
1 | ReportedOverCommonPoint(A,B) | __=T | . | ||
2 | "SameOr Diverging Tracks"(A,B) | __=T | . | ||
3 | AllOf [A;B] (IsOnRoute Routes3) | . | __=T | ||
otherSameDirLongSep (A,B) | 15 | 20 | 30 |
Often it is the case that two conditions can not both be true
at the same time. However, both conditions can be false. "env1"
specifies constraints of this sort.
env1 :=
(forall (A:flight). NOT (IsLevel (A) AND InCruiseClimb (A)))
AND
(forall (A:flight).NOT (IsOnRoute (Routes1) (A) AND IsOnRoute (Routes2) (A)));
In order to check the symmetry of the tables, environmental assumptions
are needed about the symmetry of some primitive terms.
env2 :=
(forall (A:flight) (B:flight).
ReportedOverCommonPoint(A,B) = ReportedOverCommonPoint(B,A))
AND
(forall (A:flight) (B:flight).
SameMachNumber(A,B) = SameMachNumber(B,A))
AND
(forall (A:flight) (B:flight).
SameType(A,B) = SameType(B,A))
AND
(forall (A:flight) (B:flight).
"SameOr Diverging Tracks"(A,B) = "SameOr Diverging Tracks"(B,A))
AND
(forall (A:flight) (B:flight).
"Appropriate TimeSep AtCommon Point"(A,B) =
"Appropriate TimeSep AtCommon Point"(B,A)) ;
There are also some numeric relationships between the rows used in the
LatitudeEquivalent table.
env3 :=
(forall A.
if "LatChange Per10DLong LessThanOrEq2" (A)
then "LatChange Per10DLong LessThanOrEq3" (A))
AND
(forall A.
if "LatChange Per10DLong LessThanOrEq1" (A)
then "LatChange Per10DLong LessThanOrEq2" (A))
AND
(forall A.
if "LatChange Per10DLong LessThanOrEq1" (A)
then "LatChange Per10DLong LessThanOrEq3" (A));
All environmental assumptions are given by:
env := env1 AND env2 AND env3;
:flight;
:location := Azores | BDA | CAN | Caribbean | IberianPeninsula | Iceland | Scandinavia | UnitedKingdom | USA ;
:segment;
:time == num;
Constants include functions, and predicates in addition to data values.
IsSupersonic :(flight -> bool);
IsTurbojet :(flight -> bool);
HavePartOfRouteInMNPSAirspace : (flight -> bool) ;
MeetMNPS :(flight -> bool);
OnPublishedRoute :(flight -> bool);
RouteDeparture :(flight -> location);
RouteDestination :(flight -> location);
MachTechniqueUsed : flight ->bool;
FlightLevel:(flight -> num);
InCruiseClimb:(flight -> bool);
InWATRSAirspace :(flight -> bool);
IsLevel:(flight -> bool);
IsOutsideMNPSAirspace :(flight -> bool);
IsWestOf60W :(flight -> bool);
IsWestOf55W:(flight -> bool);
"LatChange Per10DLong LessThanOrEq1" :flight->bool;
"LatChange Per10DLong LessThanOrEq2" :flight->bool;
"LatChange Per10DLong LessThanOrEq3" :flight->bool;
LateralPositionInDegrees :(flight -> num);
LateralPositionInMiles :(flight -> num);
Mach : (flight->num);
RouteSegment :(flight -> segment);
"RouteSegment Degrees" :(flight -> num);
TimeAtPosition :(flight->time);
SameMachNumber :((flight # flight) -> bool);
FirstAircraft :((flight # flight) -> flight);
ept : ((flight # flight)->time);
"SameOr Diverging Tracks" :((flight # flight) -> bool);
SecondAircraft :((flight # flight) -> flight);
ReportedOverCommonPoint :((flight # flight) -> bool);
"Appropriate TimeSep AtCommon Point":((flight # flight) -> bool);
EnterWATRSAirspaceAtSomeTime : (flight -> bool);
StartTime : (time # time) -> time;
EndTime : (time # time) -> time;
MinEarliestTime : (time # time)set -> time;
MaxLatestTime : (time # time)set -> time;
ABS : num -> num;
Min: ((num)set -> num);
%include startup.s %include table.s
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp VerticalSeparationRequired env VerticalSeparationRequired is: ( (Table [ ((Row (FlightLevel A)) [(\x.(x <= 280));DC;(\x.(x > 450));(\x.(x > 450))]) ; ((Row (FlightLevel B)) [DC;(\x.(x <= 280));(\x.(x > 450));(\x.(x > 450))]) ;((Row (IsSupersonic A)) [DC;DC;TRUE;DC]); ((Row (IsSupersonic B)) [DC;DC;DC;TRUE])]) [1000;1000;4000;4000;2000]) Invoking interval checker... Interval checker partitions the range into: ((FlightLevel A) > 450) ((280 < (FlightLevel A)) AND ((FlightLevel A) <= 450)) ((FlightLevel A) <= 280) Invoking interval checker... Interval checker partitions the range into: ((FlightLevel B) > 450) ((280 < (FlightLevel B)) AND ((FlightLevel B) <= 450)) ((FlightLevel B) <= 280) The following cases yield the default value of 2000 Case 1 Row 1 : ((280 < (FlightLevel A)) AND ((FlightLevel A) <= 450)) Row 2 : ((FlightLevel B) > 450) Row 3 : DC Row 4 : DC Case 2 Row 1 : ((FlightLevel A) > 450) Row 2 : ((280 < (FlightLevel B)) AND ((FlightLevel B) <= 450)) Row 3 : DC Row 4 : DC Case 3 Row 1 : ((280 < (FlightLevel A)) AND ((FlightLevel A) <= 450)) Row 2 : ((280 < (FlightLevel B)) AND ((FlightLevel B) <= 450)) Row 3 : DC Row 4 : DC Case 4 Row 1 : ((FlightLevel A) > 450) Row 2 : ((FlightLevel B) > 450) Row 3 : ((IsSupersonic A) = F) Row 4 : ((IsSupersonic B) = F) Stats for VerticalSeparationRequired completeness checking: Number of cases identified: 4 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons VerticalSeparationRequired env VerticalSeparationRequired is: ( (Table [ ((Row (FlightLevel A)) [(\x.(x <= 280));DC;(\x.(x > 450));(\x.(x > 450))]) ; ((Row (FlightLevel B)) [DC;(\x.(x <= 280));(\x.(x > 450));(\x.(x > 450))]) ;((Row (IsSupersonic A)) [DC;DC;TRUE;DC]); ((Row (IsSupersonic B)) [DC;DC;DC;TRUE])]) [1000;1000;4000;4000;2000]) Invoking interval checker... Interval checker partitions the range into: ((FlightLevel A) > 450) ((280 < (FlightLevel A)) AND ((FlightLevel A) <= 450)) ((FlightLevel A) <= 280) Invoking interval checker... Interval checker partitions the range into: ((FlightLevel B) > 450) ((280 < (FlightLevel B)) AND ((FlightLevel B) <= 450)) ((FlightLevel B) <= 280) No inconsistencies were found in the table. Stats for VerticalSeparationRequired consistency checking: Number of cases identified: 0 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym VerticalSeparationRequired env VerticalSeparationRequired is: ( (Table [ ((Row (FlightLevel A)) [(\x.(x <= 280));DC;(\x.(x > 450));(\x.(x > 450))]) ; ((Row (FlightLevel B)) [DC;(\x.(x <= 280));(\x.(x > 450));(\x.(x > 450))]) ;((Row (IsSupersonic A)) [DC;DC;TRUE;DC]); ((Row (IsSupersonic B)) [DC;DC;DC;TRUE])]) [1000;1000;4000;4000;2000]) The table is symmetric. Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp "LateralSeparation RequiredInDegrees" env "LateralSeparation RequiredInDegrees" is: ( (Table [ ((Row ((AllOf [A;B]) IsOutsideMNPSAirspace)) [TRUE;TRUE;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes1))) [TRUE;DC;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes2))) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsWestOf55W)) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsSupersonic)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) FlightLevelAbove275)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) MeetMNPS)) [DC;DC;DC;TRUE]); ((Row ((AllOf [A;B]) HavePartOfRouteInMNPSAirspace)) [DC;DC;DC;TRUE])]) [1.5;1.5;1;1;2]) The following cases yield the default value of 2 Case 1 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : DC Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 2 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : DC Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 3 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 4 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = F) Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 5 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : DC Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 6 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : DC Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 7 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 8 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = F) Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 9 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : DC Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 10 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : DC Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 11 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 12 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = F) Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 13 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : DC Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 14 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : DC Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 15 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 16 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = F) Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Stats for "LateralSeparation RequiredInDegrees" completeness checking: Number of cases identified: 16 Processor time: user: 3 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons "LateralSeparation RequiredInDegrees" env "LateralSeparation RequiredInDegrees" is: ( (Table [ ((Row ((AllOf [A;B]) IsOutsideMNPSAirspace)) [TRUE;TRUE;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes1))) [TRUE;DC;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes2))) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsWestOf55W)) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsSupersonic)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) FlightLevelAbove275)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) MeetMNPS)) [DC;DC;DC;TRUE]); ((Row ((AllOf [A;B]) HavePartOfRouteInMNPSAirspace)) [DC;DC;DC;TRUE])]) [1.5;1.5;1;1;2]) Columns 1 and 3 conflict in the following: Case 1 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = T) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = T) Row 7 : DC Row 8 : DC Columns 1 and 4 conflict in the following: Case 2 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = T) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : DC Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = T) Columns 2 and 3 conflict in the following: Case 3 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = T) Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = T) Row 7 : DC Row 8 : DC Columns 2 and 4 conflict in the following: Case 4 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = T) Row 5 : DC Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = T) Stats for "LateralSeparation RequiredInDegrees" consistency checking: Number of cases identified: 4 Processor time: user: 2 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym "LateralSeparation RequiredInDegrees" env "LateralSeparation RequiredInDegrees" is: ( (Table [ ((Row ((AllOf [A;B]) IsOutsideMNPSAirspace)) [TRUE;TRUE;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes1))) [TRUE;DC;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes2))) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsWestOf55W)) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsSupersonic)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) FlightLevelAbove275)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) MeetMNPS)) [DC;DC;DC;TRUE]); ((Row ((AllOf [A;B]) HavePartOfRouteInMNPSAirspace)) [DC;DC;DC;TRUE])]) [1.5;1.5;1;1;2]) The table is symmetric. Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp "LateralSeparation RequiredInMiles" env "LateralSeparation RequiredInMiles" is: ( (Table [ ((Row ((AllOf [A;B]) IsOutsideMNPSAirspace)) [TRUE;TRUE;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes1))) [TRUE;DC;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes2))) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsWestOf55W)) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsSupersonic)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) FlightLevelAbove275)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) MeetMNPS)) [DC;DC;DC;TRUE]); ((Row ((AllOf [A;B]) HavePartOfRouteInMNPSAirspace)) [DC;DC;DC;TRUE])]) [90;90;60;60;120]) The following cases yield the default value of 120 Case 1 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : DC Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 2 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : DC Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 3 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 4 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = F) Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 5 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : DC Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 6 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : DC Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 7 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 8 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = F) Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = F) Row 8 : DC Case 9 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : DC Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 10 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : DC Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 11 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 12 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = F) Row 5 : (((AllOf [A;B]) IsSupersonic) = F) Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 13 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : DC Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 14 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = F) Row 2 : DC Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 15 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Case 16 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = F) Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = F) Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = F) Stats for "LateralSeparation RequiredInMiles" completeness checking: Number of cases identified: 16 Processor time: user: 4 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons "LateralSeparation RequiredInMiles" env "LateralSeparation RequiredInMiles" is: ( (Table [ ((Row ((AllOf [A;B]) IsOutsideMNPSAirspace)) [TRUE;TRUE;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes1))) [TRUE;DC;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes2))) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsWestOf55W)) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsSupersonic)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) FlightLevelAbove275)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) MeetMNPS)) [DC;DC;DC;TRUE]); ((Row ((AllOf [A;B]) HavePartOfRouteInMNPSAirspace)) [DC;DC;DC;TRUE])]) [90;90;60;60;120]) Columns 1 and 3 conflict in the following: Case 1 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = T) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = T) Row 7 : DC Row 8 : DC Columns 1 and 4 conflict in the following: Case 2 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = T) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = F) Row 4 : DC Row 5 : DC Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = T) Columns 2 and 3 conflict in the following: Case 3 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = T) Row 5 : (((AllOf [A;B]) IsSupersonic) = T) Row 6 : (((AllOf [A;B]) FlightLevelAbove275) = T) Row 7 : DC Row 8 : DC Columns 2 and 4 conflict in the following: Case 4 Row 1 : (((AllOf [A;B]) IsOutsideMNPSAirspace) = T) Row 2 : (((AllOf [A;B]) (IsOnRoute Routes1)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes2)) = T) Row 4 : (((AllOf [A;B]) IsWestOf55W) = T) Row 5 : DC Row 6 : DC Row 7 : (((AllOf [A;B]) MeetMNPS) = T) Row 8 : (((AllOf [A;B]) HavePartOfRouteInMNPSAirspace) = T) Stats for "LateralSeparation RequiredInMiles" consistency checking: Number of cases identified: 4 Processor time: user: 3 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym "LateralSeparation RequiredInMiles" env "LateralSeparation RequiredInMiles" is: ( (Table [ ((Row ((AllOf [A;B]) IsOutsideMNPSAirspace)) [TRUE;TRUE;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes1))) [TRUE;DC;DC;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes2))) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsWestOf55W)) [DC;TRUE;DC;DC]); ((Row ((AllOf [A;B]) IsSupersonic)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) FlightLevelAbove275)) [DC;DC;TRUE;DC]); ((Row ((AllOf [A;B]) MeetMNPS)) [DC;DC;DC;TRUE]); ((Row ((AllOf [A;B]) HavePartOfRouteInMNPSAirspace)) [DC;DC;DC;TRUE])]) [90;90;60;60;120]) The table is symmetric. Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp LatitudeEquivalent env LatitudeEquivalent is: (PredicateTable [ ((Row ("RouteSegment Degrees" A)) [(\x.(x <= 58));DC;(\x.((58 < x) AND (x < 70)));DC; (\x.((70 <= x) AND (x <= 80)));DC]); ((Row ("RouteSegment Degrees" B)) [DC;(\x.(x <= 58));DC;(\x.((x > 58) AND (x < 70)));DC ;(\x.((70 <= x) AND (x <= 80)))]); ((Row ((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3")) [TRUE;TRUE;DC;DC;DC;DC]); ((Row ((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2")) [DC;DC;TRUE;TRUE;DC;DC]); ((Row ((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1")) [DC;DC;DC;DC;TRUE;TRUE])]) Invoking interval checker... Interval checker partitions the range into: (80 < ("RouteSegment Degrees" A)) ((70 <= ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) <= 80)) ((58 < ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) < 70)) (("RouteSegment Degrees" A) <= 58) Invoking interval checker... Interval checker partitions the range into: (80 < ("RouteSegment Degrees" B)) ((70 <= ("RouteSegment Degrees" B)) AND (("RouteSegment Degrees" B) <= 80)) ((("RouteSegment Degrees" B) > 58) AND (("RouteSegment Degrees" B) < 70)) (("RouteSegment Degrees" B) <= 58) The predicate is false for the following cases: Case 1 Row 1 : (80 < ("RouteSegment Degrees" A)) Row 2 : (80 < ("RouteSegment Degrees" B)) Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = T) Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = T) Row 5 : DC Case 2 Row 1 : ((70 <= ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) <= 80)) Row 2 : (80 < ("RouteSegment Degrees" B)) Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = T) Row 4 : DC Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 3 Row 1 : (80 < ("RouteSegment Degrees" A)) Row 2 : ((70 <= ("RouteSegment Degrees" B)) AND (("RouteSegment Degrees" B) <= 80)) Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = T) Row 4 : DC Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 4 Row 1 : ((70 <= ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) <= 80)) Row 2 : ((70 <= ("RouteSegment Degrees" B)) AND (("RouteSegment Degrees" B) <= 80)) Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = T) Row 4 : DC Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 5 Row 1 : (80 < ("RouteSegment Degrees" A)) Row 2 : (80 < ("RouteSegment Degrees" B)) Row 3 : DC Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 6 Row 1 : ((58 < ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) < 70)) Row 2 : (80 < ("RouteSegment Degrees" B)) Row 3 : DC Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 7 Row 1 : ((58 < ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) < 70)) Row 2 : ((70 <= ("RouteSegment Degrees" B)) AND (("RouteSegment Degrees" B) <= 80)) Row 3 : DC Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 8 Row 1 : (80 < ("RouteSegment Degrees" A)) Row 2 : ((("RouteSegment Degrees" B) > 58) AND (("RouteSegment Degrees" B) < 70)) Row 3 : DC Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 9 Row 1 : ((70 <= ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) <= 80)) Row 2 : ((("RouteSegment Degrees" B) > 58) AND (("RouteSegment Degrees" B) < 70)) Row 3 : DC Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 10 Row 1 : ((58 < ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) < 70)) Row 2 : ((("RouteSegment Degrees" B) > 58) AND (("RouteSegment Degrees" B) < 70)) Row 3 : DC Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 11 Row 1 : (("RouteSegment Degrees" A) <= 58) Row 2 : DC Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = F) Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 12 Row 1 : ((70 <= ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) <= 80)) Row 2 : (80 < ("RouteSegment Degrees" B)) Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = F) Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 13 Row 1 : (80 < ("RouteSegment Degrees" A)) Row 2 : ((70 <= ("RouteSegment Degrees" B)) AND (("RouteSegment Degrees" B) <= 80)) Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = F) Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 14 Row 1 : ((70 <= ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) <= 80)) Row 2 : ((70 <= ("RouteSegment Degrees" B)) AND (("RouteSegment Degrees" B) <= 80)) Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = F) Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 15 Row 1 : (80 < ("RouteSegment Degrees" A)) Row 2 : (("RouteSegment Degrees" B) <= 58) Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = F) Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 16 Row 1 : ((70 <= ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) <= 80)) Row 2 : (("RouteSegment Degrees" B) <= 58) Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = F) Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Case 17 Row 1 : ((58 < ("RouteSegment Degrees" A)) AND (("RouteSegment Degrees" A) < 70)) Row 2 : (("RouteSegment Degrees" B) <= 58) Row 3 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3") = F) Row 4 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2") = F) Row 5 : (((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1") = F) Stats for LatitudeEquivalent completeness checking: Number of cases identified: 17 Processor time: user: 2 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons LatitudeEquivalent env LatitudeEquivalent is: (PredicateTable [ ((Row ("RouteSegment Degrees" A)) [(\x.(x <= 58));DC;(\x.((58 < x) AND (x < 70)));DC; (\x.((70 <= x) AND (x <= 80)));DC]); ((Row ("RouteSegment Degrees" B)) [DC;(\x.(x <= 58));DC;(\x.((x > 58) AND (x < 70)));DC ;(\x.((70 <= x) AND (x <= 80)))]); ((Row ((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3")) [TRUE;TRUE;DC;DC;DC;DC]); ((Row ((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2")) [DC;DC;TRUE;TRUE;DC;DC]); ((Row ((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1")) [DC;DC;DC;DC;TRUE;TRUE])]) By definition a predicate table can not be inconsistent, since it returns "T" for all columns. Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym LatitudeEquivalent env LatitudeEquivalent is: (PredicateTable [ ((Row ("RouteSegment Degrees" A)) [(\x.(x <= 58));DC;(\x.((58 < x) AND (x < 70)));DC; (\x.((70 <= x) AND (x <= 80)));DC]); ((Row ("RouteSegment Degrees" B)) [DC;(\x.(x <= 58));DC;(\x.((x > 58) AND (x < 70)));DC ;(\x.((70 <= x) AND (x <= 80)))]); ((Row ((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq3")) [TRUE;TRUE;DC;DC;DC;DC]); ((Row ((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq2")) [DC;DC;TRUE;TRUE;DC;DC]); ((Row ((AllOf [A;B]) "LatChange Per10DLong LessThanOrEq1")) [DC;DC;DC;DC;TRUE;TRUE])]) The table is symmetric if the following condition is true: ((58 < ("RouteSegment Degrees" A)) OR ((NOT (58 < ("RouteSegment Degrees" A))) AND (("RouteSegment Degrees" B) > 58))) = ((58 < ("RouteSegment Degrees" B)) OR ((NOT (58 < ("RouteSegment Degrees" B))) AND (("RouteSegment Degrees" A) > 58))) Processor time: user: 2 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp LongSameDirSepRequired env LongSameDirSepRequired is: ( (Table [((Row ((AllOf [A;B]) IsSupersonic)) [TRUE;FALSE]); ((Row ((AllOf [A;B]) IsTurbojet)) [DC;TRUE])]) [(ssSameDirLongSep (A , B));("turbojetSameDir LongSep" (A , B)); (otherSameDirLongSep (A , B))]) The following cases yield the default value of (otherSameDirLongSep (A , B)) Case 1 Row 1 : (((AllOf [A;B]) IsSupersonic) = F) Row 2 : (((AllOf [A;B]) IsTurbojet) = F) Stats for LongSameDirSepRequired completeness checking: Number of cases identified: 1 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons LongSameDirSepRequired env LongSameDirSepRequired is: ( (Table [((Row ((AllOf [A;B]) IsSupersonic)) [TRUE;FALSE]); ((Row ((AllOf [A;B]) IsTurbojet)) [DC;TRUE])]) [(ssSameDirLongSep (A , B));("turbojetSameDir LongSep" (A , B)); (otherSameDirLongSep (A , B))]) No inconsistencies were found in the table. Stats for LongSameDirSepRequired consistency checking: Number of cases identified: 0 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym LongSameDirSepRequired env LongSameDirSepRequired is: ( (Table [((Row ((AllOf [A;B]) IsSupersonic)) [TRUE;FALSE]); ((Row ((AllOf [A;B]) IsTurbojet)) [DC;TRUE])]) [(ssSameDirLongSep (A , B));("turbojetSameDir LongSep" (A , B)); (otherSameDirLongSep (A , B))]) Assumption: (ssSameDirLongSep (A , B)) = (ssSameDirLongSep (B , A)) Assumption: ("turbojetSameDir LongSep" (A , B)) = ("turbojetSameDir LongSep" (B , A)) Assumption: (otherSameDirLongSep (A , B)) = (otherSameDirLongSep (B , A)) The table is symmetric. Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp "OppDir NoLongSepPeriod" env "OppDir NoLongSepPeriod" is: ( (Table [((Row ((AllOf [A;B]) IsSupersonic)) [TRUE;FALSE]); ((Row ((AllOf [A;B]) IsTurbojet)) [DC;TRUE])]) [("ssOppDir NoLongSepPeriod" (A , B)); ("turbojetOppDir NoLongSepPeriod" (A , B)); ("otherOppDir NoLongSepPeriod" (A , B))]) The following cases yield the default value of ("otherOppDir NoLongSepPeriod" (A , B)) Case 1 Row 1 : (((AllOf [A;B]) IsSupersonic) = F) Row 2 : (((AllOf [A;B]) IsTurbojet) = F) Stats for "OppDir NoLongSepPeriod" completeness checking: Number of cases identified: 1 Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons "OppDir NoLongSepPeriod" env "OppDir NoLongSepPeriod" is: ( (Table [((Row ((AllOf [A;B]) IsSupersonic)) [TRUE;FALSE]); ((Row ((AllOf [A;B]) IsTurbojet)) [DC;TRUE])]) [("ssOppDir NoLongSepPeriod" (A , B)); ("turbojetOppDir NoLongSepPeriod" (A , B)); ("otherOppDir NoLongSepPeriod" (A , B))]) No inconsistencies were found in the table. Stats for "OppDir NoLongSepPeriod" consistency checking: Number of cases identified: 0 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym "OppDir NoLongSepPeriod" env "OppDir NoLongSepPeriod" is: ( (Table [((Row ((AllOf [A;B]) IsSupersonic)) [TRUE;FALSE]); ((Row ((AllOf [A;B]) IsTurbojet)) [DC;TRUE])]) [("ssOppDir NoLongSepPeriod" (A , B)); ("turbojetOppDir NoLongSepPeriod" (A , B)); ("otherOppDir NoLongSepPeriod" (A , B))]) Assumption: ("ssOppDir NoLongSepPeriod" (A , B)) = ("ssOppDir NoLongSepPeriod" (B , A)) Assumption: ("turbojetOppDir NoLongSepPeriod" (A , B)) = ("turbojetOppDir NoLongSepPeriod" (B , A)) Assumption: ("otherOppDir NoLongSepPeriod" (A , B)) = ("otherOppDir NoLongSepPeriod" (B , A)) The table is symmetric. Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp "ssOppDir NoLongSepPeriod" env "ssOppDir NoLongSepPeriod" is: ( (Table [((Row (ReportedOverCommonPoint (A , B))) [TRUE;FALSE])] ) [((ept (A , B)) , ((ept (A , B)) + 10)); (((ept (A , B)) - 15) , ((ept (A , B)) + 15))]) The table is complete. Stats for "ssOppDir NoLongSepPeriod" completeness checking: Number of cases identified: 0 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons "ssOppDir NoLongSepPeriod" env "ssOppDir NoLongSepPeriod" is: ( (Table [((Row (ReportedOverCommonPoint (A , B))) [TRUE;FALSE])] ) [((ept (A , B)) , ((ept (A , B)) + 10)); (((ept (A , B)) - 15) , ((ept (A , B)) + 15))]) No inconsistencies were found in the table. Stats for "ssOppDir NoLongSepPeriod" consistency checking: Number of cases identified: 0 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym "ssOppDir NoLongSepPeriod" env "ssOppDir NoLongSepPeriod" is: ( (Table [((Row (ReportedOverCommonPoint (A , B))) [TRUE;FALSE])] ) [((ept (A , B)) , ((ept (A , B)) + 10)); (((ept (A , B)) - 15) , ((ept (A , B)) + 15))]) Assumption: ((ept (A , B)) , ((ept (A , B)) + 10)) = ((ept (B , A)) , ((ept (B , A)) + 10)) Assumption: (((ept (A , B)) - 15) , ((ept (A , B)) + 15)) = (((ept (B , A)) - 15) , ((ept (B , A)) + 15)) The table is symmetric. Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp ssSameDirLongSep env ssSameDirLongSep is: ( (Table [((Row (ssSubcondition (A , B))) [TRUE;TRUE]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE]); ((Row (ReportedOverCommonPoint (A , B))) [TRUE;DC]); ((Row ("Appropriate TimeSep AtCommon Point" (A , B))) [DC;TRUE] )]) [10;10;15]) The following cases yield the default value of 15 Case 1 Row 1 : ((ssSubcondition (A , B)) = F) Row 2 : DC Row 3 : DC Row 4 : DC Case 2 Row 1 : ((ssSubcondition (A , B)) = T) Row 2 : (("SameOr Diverging Tracks" (A , B)) = F) Row 3 : DC Row 4 : DC Case 3 Row 1 : ((ssSubcondition (A , B)) = T) Row 2 : (("SameOr Diverging Tracks" (A , B)) = T) Row 3 : ((ReportedOverCommonPoint (A , B)) = F) Row 4 : (("Appropriate TimeSep AtCommon Point" (A , B)) = F) Stats for ssSameDirLongSep completeness checking: Number of cases identified: 3 Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons ssSameDirLongSep env ssSameDirLongSep is: ( (Table [((Row (ssSubcondition (A , B))) [TRUE;TRUE]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE]); ((Row (ReportedOverCommonPoint (A , B))) [TRUE;DC]); ((Row ("Appropriate TimeSep AtCommon Point" (A , B))) [DC;TRUE] )]) [10;10;15]) No inconsistencies were found in the table. Stats for ssSameDirLongSep consistency checking: Number of cases identified: 0 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym ssSameDirLongSep env ssSameDirLongSep is: ( (Table [((Row (ssSubcondition (A , B))) [TRUE;TRUE]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE]); ((Row (ReportedOverCommonPoint (A , B))) [TRUE;DC]); ((Row ("Appropriate TimeSep AtCommon Point" (A , B))) [DC;TRUE] )]) [10;10;15]) The table is symmetric. Processor time: user: 4 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp ssSubcondition env ssSubcondition is: (PredicateTable [((Row ((AllOf [A;B]) IsLevel)) [TRUE;DC]); ((Row (SameMachNumber (A , B))) [TRUE;DC]); ((Row (SameType (A , B))) [DC;TRUE]); ((Row ((AllOf [A;B]) InCruiseClimb)) [DC;TRUE])]) The predicate is false for the following cases: Case 1 Row 1 : (((AllOf [A;B]) IsLevel) = F) Row 2 : DC Row 3 : ((SameType (A , B)) = F) Row 4 : DC Case 2 Row 1 : (((AllOf [A;B]) IsLevel) = F) Row 2 : DC Row 3 : DC Row 4 : (((AllOf [A;B]) InCruiseClimb) = F) Case 3 Row 1 : (((AllOf [A;B]) IsLevel) = T) Row 2 : ((SameMachNumber (A , B)) = F) Row 3 : DC Row 4 : (((AllOf [A;B]) InCruiseClimb) = F) Case 4 Row 1 : (((AllOf [A;B]) IsLevel) = F) Row 2 : DC Row 3 : ((SameType (A , B)) = T) Row 4 : (((AllOf [A;B]) InCruiseClimb) = F) Stats for ssSubcondition completeness checking: Number of cases identified: 4 Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons ssSubcondition env ssSubcondition is: (PredicateTable [((Row ((AllOf [A;B]) IsLevel)) [TRUE;DC]); ((Row (SameMachNumber (A , B))) [TRUE;DC]); ((Row (SameType (A , B))) [DC;TRUE]); ((Row ((AllOf [A;B]) InCruiseClimb)) [DC;TRUE])]) By definition a predicate table can not be inconsistent, since it returns "T" for all columns. Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym ssSubcondition env ssSubcondition is: (PredicateTable [((Row ((AllOf [A;B]) IsLevel)) [TRUE;DC]); ((Row (SameMachNumber (A , B))) [TRUE;DC]); ((Row (SameType (A , B))) [DC;TRUE]); ((Row ((AllOf [A;B]) InCruiseClimb)) [DC;TRUE])]) The table is symmetric Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp "turbojetSameDir LongSep" env "turbojetSameDir LongSep" is: ( (Table [((Row (MNPSCondition (A , B))) [TRUE;FALSE;TRUE;FALSE]); ((Row (WATRSCondition (A , B))) [TRUE;TRUE;FALSE;FALSE])] ) [(MinAll (A , B)); (Min {("WATRSSameDir LongSep" (A , B)); ("genSameDir LongSep" (A , B))}); (Min {("MNPSSameDir LongSep" (A , B));("genSameDir LongSep" (A , B)) });("genSameDir LongSep" (A , B))]) The table is complete. Stats for "turbojetSameDir LongSep" completeness checking: Number of cases identified: 0 Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons "turbojetSameDir LongSep" env "turbojetSameDir LongSep" is: ( (Table [((Row (MNPSCondition (A , B))) [TRUE;FALSE;TRUE;FALSE]); ((Row (WATRSCondition (A , B))) [TRUE;TRUE;FALSE;FALSE])] ) [(MinAll (A , B)); (Min {("WATRSSameDir LongSep" (A , B)); ("genSameDir LongSep" (A , B))}); (Min {("MNPSSameDir LongSep" (A , B));("genSameDir LongSep" (A , B)) });("genSameDir LongSep" (A , B))]) No inconsistencies were found in the table. Stats for "turbojetSameDir LongSep" consistency checking: Number of cases identified: 0 Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym "turbojetSameDir LongSep" env "turbojetSameDir LongSep" is: ( (Table [((Row (MNPSCondition (A , B))) [TRUE;FALSE;TRUE;FALSE]); ((Row (WATRSCondition (A , B))) [TRUE;TRUE;FALSE;FALSE])] ) [(MinAll (A , B)); (Min {("WATRSSameDir LongSep" (A , B)); ("genSameDir LongSep" (A , B))}); (Min {("MNPSSameDir LongSep" (A , B));("genSameDir LongSep" (A , B)) });("genSameDir LongSep" (A , B))]) Assumption: (MinAll (A , B)) = (MinAll (B , A)) Assumption: (Min {("WATRSSameDir LongSep" (A , B));("genSameDir LongSep" (A , B))} ) = (Min {("WATRSSameDir LongSep" (B , A));("genSameDir LongSep" (B , A))} ) Assumption: (Min {("MNPSSameDir LongSep" (A , B));("genSameDir LongSep" (A , B))}) = (Min {("MNPSSameDir LongSep" (B , A));("genSameDir LongSep" (B , A))}) Assumption: ("genSameDir LongSep" (A , B)) = ("genSameDir LongSep" (B , A)) The table is symmetric. Processor time: user: 8 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp "turbojetOppDir NoLongSepPeriod" env "turbojetOppDir NoLongSepPeriod" is: ( (Table [((Row (MNPSCondition (A , B))) [TRUE;FALSE;TRUE;FALSE]); ((Row (WATRSCondition (A , B))) [TRUE;TRUE;FALSE;FALSE])] ) [(UnionAll (A , B)); (UnionOfRange {("WATRSOppDir NoLongSepPeriod" (A , B)); ("genOppDir NoLongSep Period" (A , B))}); (UnionOfRange {("MNPSOppDir NoLongSepPeriod" (A , B)); ("genOppDir NoLongSep Period" (A , B))}); ("genOppDir NoLongSep Period" (A , B))]) The table is complete. Stats for "turbojetOppDir NoLongSepPeriod" completeness checking: Number of cases identified: 0 Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons "turbojetOppDir NoLongSepPeriod" env "turbojetOppDir NoLongSepPeriod" is: ( (Table [((Row (MNPSCondition (A , B))) [TRUE;FALSE;TRUE;FALSE]); ((Row (WATRSCondition (A , B))) [TRUE;TRUE;FALSE;FALSE])] ) [(UnionAll (A , B)); (UnionOfRange {("WATRSOppDir NoLongSepPeriod" (A , B)); ("genOppDir NoLongSep Period" (A , B))}); (UnionOfRange {("MNPSOppDir NoLongSepPeriod" (A , B)); ("genOppDir NoLongSep Period" (A , B))}); ("genOppDir NoLongSep Period" (A , B))]) No inconsistencies were found in the table. Stats for "turbojetOppDir NoLongSepPeriod" consistency checking: Number of cases identified: 0 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym "turbojetOppDir NoLongSepPeriod" env "turbojetOppDir NoLongSepPeriod" is: ( (Table [((Row (MNPSCondition (A , B))) [TRUE;FALSE;TRUE;FALSE]); ((Row (WATRSCondition (A , B))) [TRUE;TRUE;FALSE;FALSE])] ) [(UnionAll (A , B)); (UnionOfRange {("WATRSOppDir NoLongSepPeriod" (A , B)); ("genOppDir NoLongSep Period" (A , B))}); (UnionOfRange {("MNPSOppDir NoLongSepPeriod" (A , B)); ("genOppDir NoLongSep Period" (A , B))}); ("genOppDir NoLongSep Period" (A , B))]) Assumption: (UnionAll (A , B)) = (UnionAll (B , A)) Assumption: (UnionOfRange {("WATRSOppDir NoLongSepPeriod" (A , B)); ("genOppDir NoLongSep Period" (A , B))}) = (UnionOfRange {("WATRSOppDir NoLongSepPeriod" (B , A)); ("genOppDir NoLongSep Period" (B , A))}) Assumption: (UnionOfRange {("MNPSOppDir NoLongSepPeriod" (A , B)); ("genOppDir NoLongSep Period" (A , B))}) = (UnionOfRange {("MNPSOppDir NoLongSepPeriod" (B , A)); ("genOppDir NoLongSep Period" (B , A))}) Assumption: ("genOppDir NoLongSep Period" (A , B)) = ("genOppDir NoLongSep Period" (B , A)) The table is symmetric. Processor time: user: 9 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp "MNPSSameDir LongSep" env "MNPSSameDir LongSep" is: ( (Table [ ((Row ("Appropriate TimeSep AtCommon Point" (A , B))) [TRUE;TRUE;TRUE;TRUE;TRUE]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE;TRUE;TRUE;TRUE]); ( (Row ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) [(\x.(x > 0.06));(\x.((0.06 >= x) AND (x > 0.05))); (\x.((0.05 >= x) AND (x > 0.04))); (\x.((0.04 >= x) AND (x > 0.03))); (\x.((0.03 >= x) AND (x > 0.02)))])]) [5;6;7;8;9;10]) Invoking interval checker... Interval checker partitions the range into: ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))) ) > 0.06) ( (0.06 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.05)) ( (0.05 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.04)) ( (0.04 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.03)) ( (0.03 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.02)) ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))) ) <= 0.02) The following cases yield the default value of 10 Case 1 Row 1 : (("Appropriate TimeSep AtCommon Point" (A , B)) = F) Row 2 : DC Row 3 : DC Case 2 Row 1 : (("Appropriate TimeSep AtCommon Point" (A , B)) = T) Row 2 : (("SameOr Diverging Tracks" (A , B)) = F) Row 3 : DC Case 3 Row 1 : (("Appropriate TimeSep AtCommon Point" (A , B)) = T) Row 2 : (("SameOr Diverging Tracks" (A , B)) = T) Row 3 : ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))) ) <= 0.02) Stats for "MNPSSameDir LongSep" completeness checking: Number of cases identified: 3 Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons "MNPSSameDir LongSep" env "MNPSSameDir LongSep" is: ( (Table [ ((Row ("Appropriate TimeSep AtCommon Point" (A , B))) [TRUE;TRUE;TRUE;TRUE;TRUE]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE;TRUE;TRUE;TRUE]); ( (Row ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) [(\x.(x > 0.06));(\x.((0.06 >= x) AND (x > 0.05))); (\x.((0.05 >= x) AND (x > 0.04))); (\x.((0.04 >= x) AND (x > 0.03))); (\x.((0.03 >= x) AND (x > 0.02)))])]) [5;6;7;8;9;10]) Invoking interval checker... Interval checker partitions the range into: ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))) ) > 0.06) ( (0.06 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.05)) ( (0.05 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.04)) ( (0.04 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.03)) ( (0.03 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.02)) ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))) ) <= 0.02) No inconsistencies were found in the table. Stats for "MNPSSameDir LongSep" consistency checking: Number of cases identified: 0 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym "MNPSSameDir LongSep" env "MNPSSameDir LongSep" is: ( (Table [ ((Row ("Appropriate TimeSep AtCommon Point" (A , B))) [TRUE;TRUE;TRUE;TRUE;TRUE]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE;TRUE;TRUE;TRUE]); ( (Row ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) [(\x.(x > 0.06));(\x.((0.06 >= x) AND (x > 0.05))); (\x.((0.05 >= x) AND (x > 0.04))); (\x.((0.04 >= x) AND (x > 0.03))); (\x.((0.03 >= x) AND (x > 0.02)))])]) [5;6;7;8;9;10]) The table is symmetric if the following condition(s) hold (some conditions may overlap): Condition 1: ( ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.06) = ( ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A)))) > 0.06)) Condition 2: ( ( (0.06 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.05)) = ( (0.06 >= ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A))))) AND ( ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A)))) > 0.05))) Condition 3: ( ( (0.05 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.04)) = ( (0.05 >= ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A))))) AND ( ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A)))) > 0.04))) Condition 4: ( ( (0.04 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.03)) = ( (0.04 >= ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A))))) AND ( ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A)))) > 0.03))) Condition 5: ( ( (0.03 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.02)) = ( (0.03 >= ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A))))) AND ( ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A)))) > 0.02))) Processor time: user: 3 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp WATRSCondition env WATRSCondition is: (PredicateTable [ ((Row ((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime)) [TRUE;TRUE]); ((Row ((AllOf [A;B]) IsWestOf60W)) [TRUE;DC]); ((Row ((AllOf [A;B]) InWATRSAirspace)) [DC;TRUE]); ((Row ((AllOf [A;B]) MachTechniqueUsed)) [TRUE;TRUE]); ((Row ((AllOf [A;B]) OnPublishedRoute)) [TRUE;TRUE]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE])]) The predicate is false for the following cases: Case 1 Row 1 : (((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime) = F) Row 2 : DC Row 3 : DC Row 4 : DC Row 5 : DC Row 6 : DC Case 2 Row 1 : (((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime) = T) Row 2 : (((AllOf [A;B]) IsWestOf60W) = F) Row 3 : (((AllOf [A;B]) InWATRSAirspace) = F) Row 4 : DC Row 5 : DC Row 6 : DC Case 3 Row 1 : (((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime) = T) Row 2 : (((AllOf [A;B]) IsWestOf60W) = T) Row 3 : DC Row 4 : (((AllOf [A;B]) MachTechniqueUsed) = F) Row 5 : DC Row 6 : DC Case 4 Row 1 : (((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime) = T) Row 2 : (((AllOf [A;B]) IsWestOf60W) = F) Row 3 : (((AllOf [A;B]) InWATRSAirspace) = T) Row 4 : (((AllOf [A;B]) MachTechniqueUsed) = F) Row 5 : DC Row 6 : DC Case 5 Row 1 : (((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime) = T) Row 2 : (((AllOf [A;B]) IsWestOf60W) = T) Row 3 : DC Row 4 : (((AllOf [A;B]) MachTechniqueUsed) = T) Row 5 : (((AllOf [A;B]) OnPublishedRoute) = F) Row 6 : DC Case 6 Row 1 : (((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime) = T) Row 2 : (((AllOf [A;B]) IsWestOf60W) = F) Row 3 : (((AllOf [A;B]) InWATRSAirspace) = T) Row 4 : (((AllOf [A;B]) MachTechniqueUsed) = T) Row 5 : (((AllOf [A;B]) OnPublishedRoute) = F) Row 6 : DC Case 7 Row 1 : (((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime) = T) Row 2 : (((AllOf [A;B]) IsWestOf60W) = T) Row 3 : DC Row 4 : (((AllOf [A;B]) MachTechniqueUsed) = T) Row 5 : (((AllOf [A;B]) OnPublishedRoute) = T) Row 6 : (("SameOr Diverging Tracks" (A , B)) = F) Case 8 Row 1 : (((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime) = T) Row 2 : (((AllOf [A;B]) IsWestOf60W) = F) Row 3 : (((AllOf [A;B]) InWATRSAirspace) = T) Row 4 : (((AllOf [A;B]) MachTechniqueUsed) = T) Row 5 : (((AllOf [A;B]) OnPublishedRoute) = T) Row 6 : (("SameOr Diverging Tracks" (A , B)) = F) Stats for WATRSCondition completeness checking: Number of cases identified: 8 Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons WATRSCondition env WATRSCondition is: (PredicateTable [ ((Row ((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime)) [TRUE;TRUE]); ((Row ((AllOf [A;B]) IsWestOf60W)) [TRUE;DC]); ((Row ((AllOf [A;B]) InWATRSAirspace)) [DC;TRUE]); ((Row ((AllOf [A;B]) MachTechniqueUsed)) [TRUE;TRUE]); ((Row ((AllOf [A;B]) OnPublishedRoute)) [TRUE;TRUE]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE])]) By definition a predicate table can not be inconsistent, since it returns "T" for all columns. Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym WATRSCondition env WATRSCondition is: (PredicateTable [ ((Row ((AllOf [A;B]) EnterWATRSAirspaceAtSomeTime)) [TRUE;TRUE]); ((Row ((AllOf [A;B]) IsWestOf60W)) [TRUE;DC]); ((Row ((AllOf [A;B]) InWATRSAirspace)) [DC;TRUE]); ((Row ((AllOf [A;B]) MachTechniqueUsed)) [TRUE;TRUE]); ((Row ((AllOf [A;B]) OnPublishedRoute)) [TRUE;TRUE]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE])]) The table is symmetric Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp "genSameDir LongSep" env "genSameDir LongSep" is: ( (Table [((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE;TRUE]) ; ((Row ((AllOf [A;B]) MachTechniqueUsed)) [FALSE;TRUE;TRUE]); ((Row ((AtLeastOneOf [A;B]) InCruiseClimb)) [FALSE;FALSE;FALSE]); ((Row (ReportedOverCommonPoint (A , B))) [TRUE;DC;DC]); ((Row ("Appropriate TimeSep AtCommon Point" (A , B))) [DC;TRUE;TRUE]); ( (Row ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) [DC;(\x.(x > 0.6));(\x.((0.6 >= x) AND (x > 0.3)))]) ]) [15;5;10;20]) Invoking interval checker... Interval checker partitions the range into: ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))) ) > 0.6) ( (0.6 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.3)) ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))) ) <= 0.30) The following cases yield the default value of 20 Case 1 Row 1 : (("SameOr Diverging Tracks" (A , B)) = F) Row 2 : DC Row 3 : DC Row 4 : DC Row 5 : DC Row 6 : DC Case 2 Row 1 : (("SameOr Diverging Tracks" (A , B)) = T) Row 2 : DC Row 3 : (((AtLeastOneOf [A;B]) InCruiseClimb) = T) Row 4 : DC Row 5 : DC Row 6 : DC Case 3 Row 1 : (("SameOr Diverging Tracks" (A , B)) = T) Row 2 : (((AllOf [A;B]) MachTechniqueUsed) = F) Row 3 : (((AtLeastOneOf [A;B]) InCruiseClimb) = F) Row 4 : ((ReportedOverCommonPoint (A , B)) = F) Row 5 : DC Row 6 : DC Case 4 Row 1 : (("SameOr Diverging Tracks" (A , B)) = T) Row 2 : (((AllOf [A;B]) MachTechniqueUsed) = T) Row 3 : (((AtLeastOneOf [A;B]) InCruiseClimb) = F) Row 4 : DC Row 5 : (("Appropriate TimeSep AtCommon Point" (A , B)) = F) Row 6 : DC Case 5 Row 1 : (("SameOr Diverging Tracks" (A , B)) = T) Row 2 : (((AllOf [A;B]) MachTechniqueUsed) = T) Row 3 : (((AtLeastOneOf [A;B]) InCruiseClimb) = F) Row 4 : DC Row 5 : (("Appropriate TimeSep AtCommon Point" (A , B)) = T) Row 6 : ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))) ) <= 0.30) Stats for "genSameDir LongSep" completeness checking: Number of cases identified: 5 Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons "genSameDir LongSep" env "genSameDir LongSep" is: ( (Table [((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE;TRUE]) ; ((Row ((AllOf [A;B]) MachTechniqueUsed)) [FALSE;TRUE;TRUE]); ((Row ((AtLeastOneOf [A;B]) InCruiseClimb)) [FALSE;FALSE;FALSE]); ((Row (ReportedOverCommonPoint (A , B))) [TRUE;DC;DC]); ((Row ("Appropriate TimeSep AtCommon Point" (A , B))) [DC;TRUE;TRUE]); ( (Row ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) [DC;(\x.(x > 0.6));(\x.((0.6 >= x) AND (x > 0.3)))]) ]) [15;5;10;20]) Invoking interval checker... Interval checker partitions the range into: ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))) ) > 0.6) ( (0.6 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.3)) ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))) ) <= 0.30) No inconsistencies were found in the table. Stats for "genSameDir LongSep" consistency checking: Number of cases identified: 0 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym "genSameDir LongSep" env "genSameDir LongSep" is: ( (Table [((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;TRUE;TRUE]) ; ((Row ((AllOf [A;B]) MachTechniqueUsed)) [FALSE;TRUE;TRUE]); ((Row ((AtLeastOneOf [A;B]) InCruiseClimb)) [FALSE;FALSE;FALSE]); ((Row (ReportedOverCommonPoint (A , B))) [TRUE;DC;DC]); ((Row ("Appropriate TimeSep AtCommon Point" (A , B))) [DC;TRUE;TRUE]); ( (Row ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) [DC;(\x.(x > 0.6));(\x.((0.6 >= x) AND (x > 0.3)))]) ]) [15;5;10;20]) The table is symmetric if the following condition(s) hold (some conditions may overlap): Condition 1: ( ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.6) = ( ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A)))) > 0.6)) Condition 2: ( ( (0.6 >= ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B))))) AND ( ((Mach (FirstAircraft (A , B))) - (Mach (SecondAircraft (A , B)))) > 0.3)) = ( (0.6 >= ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A))))) AND ( ((Mach (FirstAircraft (B , A))) - (Mach (SecondAircraft (B , A)))) > 0.3))) Processor time: user: 2 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%comp otherSameDirLongSep env otherSameDirLongSep is: ( (Table [((Row (ReportedOverCommonPoint (A , B))) [TRUE;DC]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes3))) [DC;TRUE])] ) [15;20;30]) The following cases yield the default value of 30 Case 1 Row 1 : ((ReportedOverCommonPoint (A , B)) = F) Row 2 : DC Row 3 : (((AllOf [A;B]) (IsOnRoute Routes3)) = F) Case 2 Row 1 : ((ReportedOverCommonPoint (A , B)) = T) Row 2 : (("SameOr Diverging Tracks" (A , B)) = F) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes3)) = F) Stats for otherSameDirLongSep completeness checking: Number of cases identified: 2 Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%cons otherSameDirLongSep env otherSameDirLongSep is: ( (Table [((Row (ReportedOverCommonPoint (A , B))) [TRUE;DC]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes3))) [DC;TRUE])] ) [15;20;30]) Columns 1 and 2 conflict in the following: Case 1 Row 1 : ((ReportedOverCommonPoint (A , B)) = T) Row 2 : (("SameOr Diverging Tracks" (A , B)) = T) Row 3 : (((AllOf [A;B]) (IsOnRoute Routes3)) = T) Stats for otherSameDirLongSep consistency checking: Number of cases identified: 1 Processor time: user: 1 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Fusion - Version 1.0 Sep 26 1997 15:22:26 Copyright University of British Columbia, 1996, 1997 Type "%include" or type in S paragraphs directly Type "%help" to see list of % commands. search path: . /isd/usr/day/src/fusion /isd/usr/day/examples/SeparationMinima >%include minima.s Including /isd/usr/day/examples/SeparationMinima/minima.s Including /isd/usr/day/src/fusion/startup.s Closing startup.s Including /isd/usr/day/src/fusion/table.s Closing table.s Closing onlinespec.hpp >%sym otherSameDirLongSep env otherSameDirLongSep is: ( (Table [((Row (ReportedOverCommonPoint (A , B))) [TRUE;DC]); ((Row ("SameOr Diverging Tracks" (A , B))) [TRUE;DC]); ((Row ((AllOf [A;B]) (IsOnRoute Routes3))) [DC;TRUE])] ) [15;20;30]) The table is symmetric. Processor time: user: 0 sec; system: 0 sec ------------------------------------------------------------ > Fusion session over.
Just as software developers often use a compiler to check that their code conforms to the syntax and typechecking rules of the programming language, a formal description written in S can be parsed and checked automatically by a software tool for conformance to the syntax and typechecking rules of S. This function is performed by a tool named "Fuss" developed at the University of British Columbia. Getting an S specification to be parsed by Fuss without errors is very much like getting a software package to "clean compile". "Fusion", the analysis tool used to generate the results reported in Appendix B, is an extension of Fuss developed by Nancy Day at the University of British Columbia.
There is a limited sense in which a formal description can evaluated or partially evaluated in a manner conceptually similar to the evaluation of expressions by an evaluation function for a functional programming language, e.g., a Lisp interpreter. Limitations of this sense of evaluation are related, in part, to some of the fundamental differences between S and "code" as discussed below. This includes limitations on the evaluation of S expressions that express quantification over infinite types. A subset of S could be used as a very simple, but useful, functional programming language. Various forms of evaluating formal descriptions written in S are being investigated at the University of British Columbia. One such approach is built into the "Fusion" tool used to generate the results reported in Appendix B.
Unlike programming languages (except a specialized family of "purely functional" programming languages such as variants of Lisp), there is no sense of dynamics in S such as variables whose values may change over time. There are well-known methods of using predicate logic based notations to formally describe systems with dynamic behaviour, but this is a matter of how the formal description is interpreted as the description of the dynamic behaviour of a system. Discussion of how S may be used to specify dynamic behaviour is outside the scope of this brief description of S since the formalization of the NAT separation minima is ultimately a matter of defining a static condition represented by the predicate "AreSeparated" rather than dynamic behaviour.
Another fundamental difference from most general-purpose programming languages is the ability in S to express "quantification" (e.g., "for all", "there exists") over all values of a given type. The distinction between requirements specification and design is often characterized as the difference between describing what is required and how this requirement is to be realized. Quantification is often invaluable as a means of expressing "what" rather than "how". Quantification is also valuable for expressing global properties or constraints at the requirements level. In the formalization of the NAT separation minima, quantification is used to express environment assumptions as global constraints.
A third fundamental way in which S differs from most general-purpose programming languages is its ability to support "uninterpreted" types and constants. For most general-purpose programming languages, software is a description of a series of completely defined operations on patterns of bits. However, it is often useful, such as when specifying the requirements of system, to develop a formal description on top of a set of uninterpreted types and constants. In most programming languages, a user-defined data type must be defined in such a way that the compiler or interpreter can realize instances of this data type as a patterns of bits. But in S, as well as several other formal description notations, it is possible to simply introduce the name of a user-defined type without details of its realization. Similarly, it is possible in S, to introduce a constant by providing its name and its type without details of its realization.
Uninterpreted types and uninterpreted constants are used in the formalization of the NAT separation minima to match the level of abstraction used in the source documents. In principle, an implementation of the NAT separation minima could be produced by a translation of the formalization into the notation of a programming language along with instantiations of the uninterpreted types and constants. The uninterpreted types and uninterpreted constants used in the NAT separation minima are regarded as common vocabulary for users of this formalization. They are regarded as common vocabulary in the sense that it is assumed that its users would know how to correctly instantiate the uninterpreted types and uninterpreted constants with suitable implementations.
: flight, segment;
is an example of a type declaration. This example introduces two new types, "flight" and "segment". Types introduced by means of a type declaration are "uninterpreted" in the sense that nothing is said about their composition. As mentioned earlier, an uninterpreted type represents part of what is assumed to be the common vocabulary of the intended users of the specification.
In addition to type declarations, it is possible to define new types. A type definition in S is similar to, but more general than, the notion of an enumerated type in some programming languages such as Ada. The formalization of the NAT separation minima contains just one type definition which looks very much like an enumerated type in a programming language:
: location := Azores | BDA | CAN | Caribbean | IberianPenisula | Iceland | Scandinavia | UnitedKingdom | USA ;
This type definition is used to introduce a new type named "location" and a set of constants corresponding to the names of all of locations explicitly mentioned in the separation minima.
More advanced forms of type definition allow a type to be defined as the range of a set of functions called "constructors". Under certain conditions, a type definition may be recursive allowing recursive data types such as a "binary tree" to be defined. Declared and defined types may also be parameterized by type parameters. These more advanced forms of type definition are not used in the formalization of the NAT separation minima.
In addition to type declarations and type definitions, S provides a construct for the introduction of type abbreviations. In this case, a new type is not declared or defined - instead, a new name is introduced as an abbreviation for a potentially more complicated type expression or else as an alias for the name of very general type. For example, the type abbreviation,
: time == num;
results in the introduction of "time" as an alias for "num". Type abbreviations are used mainly to enhance the readability of a specification.
The formalization of the NAT separation minima uses three different type operators, namely, "->", "#" and "set".
The infix type operator "->" is used to specify function types. For instance, the type expression "flight -> bool" is used to denote the type of a function whose domain and range are the uninterpreted type "flight" and the built-in type "bool" respectively.
The infix type operator "#" is used to specify Cartesian products, that is, types whose members are pairs of elements. For instance, the type expression "flight # flight" is used in the formalization of the NAT separation minima to denote a type whose members are pairs of flights.
The postfix type operator "set" is used to denote a type whose members are sets of elements of some other type. For example, the type expression "(num) set" denotes the type whose members are sets of whole numbers, i.e., ... -2, -1, 0, 1, 2, ... .
Type expressions may be combined using type operators to make more complex type expressions. For example, the type expression "(flight # flight) -> bool" denotes a function type whose domain is a Cartesian product, namely, "flight # flight", and whose range is "bool". Another example is the type expression "(location # location) set" which denotes a type whose values are sets of pairs of locations.
Thus, the term "constant" in a description of S refers is used more generally than for just names of "data values". The term "function" is often used to refer to constants whose values are function types. The term "predicate" is used to refer specifically to functions whose range is "bool". In other words, functions are a particular class of constants and predicates are a particular class of functions.
The formalization of the NAT separation minima introduces a number of constants. Many of these constants are introduced in the form of tables. The name of each table in Appendix B is the name of a constant.
A number of other constants are also introduced in this formalization directly in S notation - either in the form of a constant declaration or a constant definition.
A constant declaration is used to introduce an uninterpreted constant. For example, the constant declaration,
IsSupersonic: (flight -> bool);
introduces "IsSupersonic" as the name of a function whose domain and range are "flight" and "bool" respectively. This is an example of a predicate since the range of this function is "bool".
As mentioned before, an uninterpreted constant represents part of what is assumed to be the common vocabulary of the intended users of the specification. In the case of "IsSupersonic", the introduction of this function as an uninterpreted constant is based on an assumption that the intended users of the NAT separation minima all understand that the value of the attribute "IsSupersonic" can be determined somehow from the representation of a flight -- but the details of the representation of the flight and how this attribute may be obtained is a design detail beneath the desired level of abstraction for this specification.
Similarly, the constant declaration,
RouteDeparture : (flight -> location);
introduces what may be regarded informally as the name of an attribute of a flight, i.e., "RouteDeparture". As in the case of "IsSupersonic", details of how the value of this attribute is obtained from the representation of a flight is intentionally excluded from this formalization.
Other constants are introduced in the formalization by means of constant definitions. For example,
Routes2 := {(USA,Caribbean);(Can,Caribbean);(BDA,Caribbean)};
defines the constant "Routes2" in terms of a set of pairs of locations. Another instance of a constant definition,
IsOnRoute (R:(location#location) set) (X:flight) := ((RouteDeparture (X), RouteDestination (X)) In R) OR (RouteDestination (X), RouteDeparture (X)) In R);
introduces a function which may be used to determine if the departure location and destination location of a flight (the second parameter) is within a particular set of routes (the first parameter). The above definition uses an infix predicate named "In" to determine if an element is a member of set, i.e., set membership. The above definition also uses the built-in infix logical operator, "OR".
The above definition of "IsOnRoute" illustrates a feature of S which allows the parameters of functions to be separated so that they can be "provided one at a time". The first parameter of "IsOnRoute", namely, "R", is separated from its second parameter, "X". Functions of this form are known as "curried functions". This is different than grouping the parameters of a function together , e.g., "(R,X)", so that they must be "provided all at once". While this is not available in most programming languages, Standard ML allows for the definition of curried functions.
Curried functions are particularly useful in situations where a general-purpose function is partially evaluated to yield a function for a more specific purpose. For instance, the expressions "IsOnRoutes Routes1" and "IsOnRoutes Routes2" denotes two different functions. The former is a function for determining whether a flight falls within to the set of routes denoted by the constant "Routes1" while the latter corresponds to a function for determining whether a flight falls within to the set of routes denoted by "Routes2".
S allows constants to be introduced as infix functions. While the formalization of the NAT separation minima uses several "built-in" infix functions of S (e.g., "OR"), it does not include the introduction of any application specific infix functions.
Constants parameterized by types may also be declared or defined in a S specification. Several built-in polymorphic constants (i.e., constants parameterized by one or more types) are used in the formalization of the NAT separation minima; however, this formalization does not include the declaration or definition of any such constants.
Constants may be defined recursively (based on the constructors of a recursively defined type) but this feature of S is not used in the formalization of the NAT separation minima for any application specific constants.
If a function has been introduced as an infix function, e.g., "+", then it may be applied to a pair of expressions in the form of an infix application, e.g., "1 + 2".
A third kind of function application is post-fix application. In the definition of "IsOnRoute", the expression "RouteDeparture (X)" could have been written "X.RouteDeparture". This expression may informally be understood as a reference to the "RouteDeparture" attribute of the parameter "X". Actually, this expression is merely the post-fix application of the function "RouteDeparture" to this parameter. It is semantically equivalent to the prefix application of this function to "X", i.e., "RouteDeparture (X)". Post-fix function application is merely "syntactic sugar" but it has been found to be helpful as a means of improving the readability of a formal specification especially for readers of the specification who are familiar with programming notations that use "dot notation" to refer to components of records or objects.
Another form of S expression is universal quantification which is used to express the condition that a specific property is true for every value of a specific type. For example, the environmental assumptions section of the formalization includes the assertion,
forall (A:flight). NOT (IsLevel (A) and InCruiseClimb (A))
that all flights cannot both satisfy (simultaneously) the conditions represented by the predicates "IsLevel" and "InCruiseClimb". S also provides a complementary form of quantification called existential quantification to assert that at least one value of the specified type satisfies the property.
S includes special syntax for denoting pairs, e.g., "(1,2)" and sets "{1;2;3}". This illustrated by the definition of "Routes2" where the right hand side of this definition is a set of pairs of locations.
To allow S specifications to be given a code-like appearance, the syntax of S also includes special syntax for conditional expressions, i.e., "if ... then ... else" and "if ... then ...".
Another code-like construct is the let-definition construct illustrated below by the definition of the predicate "WithinOppDirNoLongSepPeriod",
WithinOppDirNoLongSepPeriod (A,B,t) := let timePeriod := "OppDir NoLongSepPeriod" (A,B) in (StartTime(timePeriod) <= t) AND (t <= EndTime(timePeriod));
where the right hand side of the definition of "WithinOppDirNoLongSepPeriod" is semantically equivalent to the following expression:
(StartTime("OppDir NoLongSepPeriod" (A,B)) <= t) AND (t <= EndTime("OppDir NoLongSepPeriod" (A,B)));
Technically, only a very small number of types and constants are fundamental elements of the notation. Most of the types and constants described here as "built-in" are really just elements of a standard library of very basic types and constants that underlies the NAT separation minima.
The dependence of the NAT separation minima formalization on this standard library is revealed by the second last line of Appendix A, where the library file "startup.s" is referenced by a "%include" directive. The other "%include" directive refers to some additional constants and types which support the tabular style of specification used in the formalization.
The only built-in types of S used in the formalization of the NAT separation minima are "bool" and "num".
Several built-in constants of S denoting arithmetic/logical functions are used with this formalization. These include "-" (subtraction), "+", ">", "<=", "<", "NOT", "OR" and "AND".