/// <summary>
		///   Initializes a new instance.
		/// </summary>
		/// <param name="result">The result of the analysis</param>
		/// <param name="firstFault">The fault that must be activated first.</param>
		/// <param name="secondFault">The fault that must be activated subsequently.</param>
		/// <param name="kind">Determines the kind of the order relationship.</param>
		internal OrderRelationship(AnalysisResult result, Fault firstFault, Fault secondFault, OrderRelationshipKind kind)
		{
			Requires.NotNull(result, nameof(result));
			Requires.NotNull(firstFault, nameof(firstFault));
			Requires.NotNull(secondFault, nameof(secondFault));
			Requires.InRange(kind, nameof(kind));

			Witness = result.CounterExample;
			FirstFault = firstFault;
			SecondFault = secondFault;
			Kind = kind;
		}
		protected bool CheckInvariant(Formula invariant, params IComponent[] components)
		{
			var modelChecker = CreateModelChecker();

			if (Arguments.Length > 1 && (bool)Arguments[1])
			{
				var results = modelChecker.CheckInvariants(TestModel.InitializeModel(components), invariant);
				CounterExample = results[0].CounterExample;
				return results[0].FormulaHolds;
			}

			Result = modelChecker.CheckInvariant(TestModel.InitializeModel(components), invariant);
			CounterExample = Result.CounterExample;
			return Result.FormulaHolds;
		}
		protected void GenerateStateSpace(params IComponent[] components)
		{
			var serializer = new RuntimeModelSerializer();
			serializer.Serialize(TestModel.InitializeModel(components), new StateFormula(() => true));

			var configuration = AnalysisConfiguration.Default;
			configuration.StateCapacity = 10000;
			configuration.StackCapacity = 10000;
			configuration.CpuCount = 1;

			var checker = new InvariantChecker(
				() => new ActivationMinimalExecutedModel(serializer.Load, configuration.SuccessorCapacity),
				s => Output.Log("{0}", s),
				configuration,
				formulaIndex: 0);

			_result = checker.Check();
			CounterExample.ShouldBe(null);

			Output.Log($"States: {_result.StateCount}");
			Output.Log($"Actual Transitions: {_result.TransitionCount}");
			Output.Log($"Computed Transitions: {_result.ComputedTransitionCount}");
		}
		/// <summary>
		///   Checks whether the <paramref name="invariants" /> holds in all states of the <paramref name="model" />.
		/// </summary>
		/// <param name="model">The model that should be checked.</param>
		/// <param name="invariants">The invariants that should be checked.</param>
		public AnalysisResult[] CheckInvariants(ModelBase model, params Formula[] invariants)
		{
			Requires.NotNull(model, nameof(model));
			Requires.NotNull(invariants, nameof(invariants));
			Requires.That(invariants.Length > 0, nameof(invariants), "Expected at least one invariant.");

			var stateGraph = GenerateStateGraph(model, invariants);
			var results = new AnalysisResult[invariants.Length];

			for (var i = 0; i < invariants.Length; ++i)
				results[i] = CheckInvariant(stateGraph, invariants[i]);

			return results;
		}