/// <summary>
        /// Ensures that measurement of given observable on given qubits will
        /// lead to result given by value
        /// </summary>
        public void ForceMeasure(IQArray <Pauli> observable, IQArray <Qubit> qubits, Result value)
        {
            Debug.Assert(observable != null);
            Debug.Assert(qubits != null);
            Debug.Assert(observable.Length == qubits.Length);

            Utils.PruneObservable(observable, qubits, out var observablePr, out var _);
            var constr = MeasurementConstraint.ForceMeasurement(observablePr, value);

            QubitConstraint.SetConstraint(QubitConstraints(qubits), constr);
        }
        /// <summary>
        /// Implements the Q# standard library callable AssertProb
        /// </summary>
        public void AssertProb(IQArray <Pauli> observable, IQArray <Qubit> qubits, Result value, double probability)
        {
            Debug.Assert(observable != null);
            Debug.Assert(qubits != null);
            Debug.Assert(observable.Length == qubits.Length);

            Utils.PruneObservable(observable, qubits, out var observablePr, out var qubitsPr);
            Debug.Assert((probability >= 0.0) && (probability <= 1.0));
            MeasurementConstraint constr = MeasurementConstraint.AssertMeasurement(observablePr, value, probability);

            QubitConstraint.SetConstraint(QubitConstraints(qubitsPr), constr);
        }