? users online
  • Logout
    • Open hangout
    • Open chat for current file
<div class="notebook">

<div class="nb-cell markdown" name="md5">
#
</div>

<div class="nb-cell markdown" name="md7">
# H.264 specification playground
This notebook contains facts and rules capturing information included in H.264 codec specification and a simple program showing how to make use of them facts to reason about possible values of fields or show dependencies between the fields.
</div>

<div class="nb-cell markdown" name="md2">
## Rules and facts fetched from H.264 specification
Please note that the database of facts and rules was created by LLM fed with content of the specification and guided to generate given facts and rules, therfore it is highly probable that it contains mistakes.
The following facts and rules are used in the database:
* `f/1`, `f/2` - field definition
* `type/2` - type of a field
* `depends_on/2` - association between a field and a list of all fields that affect the value of this field
* `constraints/2` - constraints on the value of given field
* `calculate/2` - specifies how value of given field can be inferred from values of other fields
</div>

<div class="nb-cell program" data-background="true" data-below="true" data-singleline="true" name="p1">
:- use_module(library(clpfd)).
% calculate/1 
calculate(f(luma_weight_l0(_I)), X) :-
    domain(f(luma_weight_l0_flag), Flag),
    Flag #= 0,
    domain(f(luma_log2_weight_denom), Denom),
    X #= 2^Denom.

calculate(f(luma_offset_l0(_I)), X) :-
    domain(f(luma_weight_l0_flag), Flag),
    Flag #= 0,
    X #= 0.

calculate(f(transform_size_8x8_flag), 0) :-
    domain(f(mb_type), MbType),
    mb_type('I_PCM', I_PCM),
    MbType #= I_PCM.

calculate(f(transform_size_8x8_flag), 0) :-
    domain(f(dMbPartPredMode), PredMode),
    domain(f(dMbPartPredMode('Intra_16x16', _)), Intra_16x16),
    PredMode #= Intra_16x16.

calculate(f(transform_size_8x8_flag), 0) :-
    domain(f(dCodedBlockPatternLuma), CbpLuma),
    CbpLuma #= 0.

calculate(f(transform_size_8x8_flag), 0) :-
    domain(f(transform_8x8_mode_flag), T8x8Flag),
    T8x8Flag #= 0.

calculate(f(transform_size_8x8_flag), 0) :-
    domain(f(mb_type), MbType),
    mb_type('I_NxN', I_NxN),
    MbType #= I_NxN.

calculate(f(transform_size_8x8_flag), 0) :-
    domain(f(dNoSubMbPartSizeLessThan8x8Flag), NoSubFlag),
    NoSubFlag #= 0.

calculate(f(transform_size_8x8_flag), 0) :-
    domain(f(mb_type), MbType),
    domain(f(direct_8x8_inference_flag), DirectFlag),
    DirectFlag #= 0,
    mb_type('B_Direct_16x16', B_Direct_16x16),
    MbType #= B_Direct_16x16, 
f(coded_block_pattern).

calculate(f(dMbWidthC), 0) :-
    domain(f(chroma_format_idc), 0),
    domain(f(separate_colour_plane_flag), 1).

calculate(f(dMbWidthC), Value) :-
    domain(f(chroma_format_idc), Chroma), Chroma #\= 0,
    domain(f(separate_colour_plane_flag), 0),
    domain(f(dSubWidthC), SubWidthC),
    Value #= 16 // SubWidthC.

calculate(f(dMbHeightC), 0) :-
    domain(f(chroma_format_idc), 0),
    domain(f(separate_colour_plane_flag), 1).

calculate(f(dMbHeightC), Value) :-
    domain(f(chroma_format_idc), Chroma), Chroma \= 0,
    domain(f(separate_colour_plane_flag), 0),
    domain(f(dSubHeightC), SubHeightC),
    Value #= 16 // SubHeightC.

calculate(f(redundant_pic_cnt), Default) :-
    default_value(f(redundant_pic_cnt), Default),
    domain(f(redundant_pic_cnt_present_flag), Flag),
    Flag #= 0.

calculate(f(cabac_alignment_one_bit), 1) :-
    domain(f(entropy_coding_mode_flag), Flag), Flag #= 1,
    domain(f(dByteAligned), BA), BA #= 0.

calculate(f(mb_field_decoding_flag), X) :-
    domain(f(mbaff_frame_flag), 0),
    domain(f(field_pic_flag), X).

calculate(f(mb_field_decoding_flag), X) :-
    domain(f(mbaff_frame_flag), 1),
    domain(f(dInferredMbFieldDecodingFlag), X).

calculate(f(dPicScalingListCount), N) :-
    domain(f(chroma_format_idc), ChromaFormatIdc),
    domain(f(transform_8x8_mode_flag), Transform8x8ModeFlag),
    (ChromaFormatIdc #\= 3 #&lt;==&gt; IsNotChroma3),
    (IsNotChroma3 #= 1 -&gt; Factor #= 2; Factor #= 6),
    N #= 6 + Factor * Transform8x8ModeFlag.

calculate(f(transform_8x8_mode_flag), X) :-
  domain(f(more_rbsp_data), 0), default_value(f(transform_8x8_mode_flag), X).

calculate(f(pic_scaling_matrix_present_flag), X) :-
  domain(f(more_rbsp_data), 0), default_value(f(pic_scaling_matrix_present_flag), X).

calculate(f(pic_scaling_list_present_flag(_I)), Value) :-
    domain(f(pic_scaling_matrix_present_flag), 0),
    domain(f(seq_scaling_matrix_present_flag), SeqFlag),
    (SeqFlag #= 0 -&gt; Value = 'Scaling list fall-back rule set A (Table 7-2)';
     SeqFlag #= 1 -&gt; Value = 'Scaling list fall-back rule set B (Table 7-2)').

calculate(f(second_chroma_qp_index_offset), X) :-
  domain(f(more_rbsp_data), 0), default_value(f(second_chroma_qp_index_offset), X).

calculate(f(chroma_format_idc), X) :-
    domain(f(profile_idc), Y),
    \+ member(Y, [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135]),
    default_value(f(chroma_format_idc), X).

calculate(f(separate_colour_plane_flag), X) :-
    domain(f(profile_idc), ProfileIdc),
    domain(f(chroma_format_idc), ChromaFormatIdc),
    (   \+ member(ProfileIdc, [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135])
    ;   ChromaFormatIdc #\= 3
    ),
    default_value(f(separate_colour_plane_flag), X).

calculate(f(bit_depth_luma_minus8), X) :-
    domain(f(profile_idc), Y),
    \+ member(Y, [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135]),
    default_value(f(bit_depth_luma_minus8), X).

calculate(f(bit_depth_chroma_minus8), X) :-
    domain(f(profile_idc), Y),
    \+ member(Y, [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135]),
    default_value(f(bit_depth_chroma_minus8), X).

calculate(f(qpprime_y_zero_transform_bypass_flag), X) :-
    domain(f(profile_idc), Y),
    \+ member(Y, [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135]),
    default_value(f(qpprime_y_zero_transform_bypass_flag), X).

calculate(f(seq_scaling_matrix_present_flag), X) :-
    domain(f(profile_idc), Y),
    \+ member(Y, [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135]),
    default_value(f(seq_scaling_matrix_present_flag), X).

calculate(f(seq_scaling_list_present_flag(_I)), X) :-
    domain(f(profile_idc), ProfileIdc),
    domain(f(seq_scaling_matrix_present_flag), SeqScalingMatrixPresentFlag),
    (   \+ member(ProfileIdc, [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135])
    ;   SeqScalingMatrixPresentFlag #\= 1
    ),
    X #= 0.

calculate(f(mb_adaptive_frame_field_flag), 0) :-
    domain(f(frame_mbs_only_flag), Flag), Flag #= 1.

calculate(f(frame_crop_left_offset), 0) :-
    domain(f(frame_cropping_flag), Flag), Flag #= 0.

calculate(f(frame_crop_right_offset), 0) :-
    domain(f(frame_cropping_flag), Flag), Flag #= 0.

calculate(f(frame_crop_top_offset), 0) :-
    domain(f(frame_cropping_flag), Flag), Flag #= 0.

calculate(f(frame_crop_bottom_offset), 0) :-
    domain(f(frame_cropping_flag), Flag), Flag #= 0.

calculate(f(coded_block_flag), 1) :-
    domain(f(residual_block_cabac, dMaxNumCoeff), MaxCoeff),
    domain(f(dChromaArrayType), ChromaType),
    (MaxCoeff #= 64, ChromaType #\= 3).

calculate(f(delta_pic_order_cnt(1)), Val) :-
    ( domain(f(pic_order_cnt_type), CntType), CntType #\= 1
    ; domain(f(delta_pic_order_always_zero_flag), ZeroFlag), ZeroFlag #= 1
    ; domain(f(bottom_field_pic_order_in_frame_present_flag), PresentFlag), PresentFlag #= 0
    ; domain(f(field_pic_flag), FieldFlag), FieldFlag #= 1
    ),
    default_value(f(delta_pic_order_cnt(1)), Val).

calculate(f(num_ref_idx_l0_active_minus1), Val) :-
    domain(f(num_ref_idx_active_override_flag), OverrideFlag),
    OverrideFlag #= 0,
    domain(f(dNumRefIdxL0DefaultActiveMinus1), Val).

calculate(f(num_ref_idx_l1_active_minus1), Val) :-
    ( domain(f(num_ref_idx_active_override_flag), OverrideFlag), OverrideFlag #= 0
    ; domain(f(slice_type), SliceType), \+ member(SliceType, [b])
    ),
    domain(f(dNumRefIdxL1DefaultActiveMinus1), Val).

calculate(f(disable_deblocking_filter_idc), Val) :-
    domain(f(deblocking_filter_control_present_flag), Flag),
    Flag #= 0,
    default_value(f(disable_deblocking_filter_idc), Val).

calculate(f(slice_alpha_c0_offset_div2), Val) :-
    ( domain(f(deblocking_filter_control_present_flag), Flag), Flag #= 0
    ; domain(f(disable_deblocking_filter_idc), Idc), Idc #= 1
    ),
    default_value(f(slice_alpha_c0_offset_div2), Val).

calculate(f(slice_beta_offset_div2), Val) :-
    ( domain(f(deblocking_filter_control_present_flag), Flag), Flag #= 0
    ; domain(f(disable_deblocking_filter_idc), Idc), Idc #= 1
    ),
    default_value(f(slice_beta_offset_div2), Val).

calculate(f(sub_mb_type(MbPartIdx)), Val) :-
    ( domain(f(mb_type), MbType), mb_type('I_PCM', I_PCM), MbType == I_PCM
    ; domain(f(mb_type), MbType), mb_type('I_NxN', I_NxN), MbType == I_NxN
    ; domain(f(dMbPartPredMode(_MbType, 0)), PredMode), PredMode == 'Intra_16x16'
    ; domain(f(dNumMbPart(_MbType)), NumPart), NumPart #\= 4
    ),
    default_value(f(sub_mb_type(MbPartIdx)), Val).

calculate(f(dPicScalingListCount), Count) :-
    domain(f(chroma_format_idc), Cfi), Cfi #\= 3,
    domain(f(transform_8x8_mode_flag), T8m),
    Count #= 6 + 2 * T8m.

calculate(f(dPicScalingListCount), Count) :-
    domain(f(chroma_format_idc), Cfi), Cfi #= 3,
    domain(f(transform_8x8_mode_flag), T8m),
    Count #= 6 + 6 * T8m.

calculate(f(dSeqScalingListCount), 8) :-
  domain(f(chroma_format_idc), Cfi), Cfi #\= 3.

calculate(f(dSeqScalingListCount), 12) :-
  domain(f(chroma_format_idc), Cfi), Cfi #= 3.

calculate(f(dIdrPicFlag), 1) :-
    domain(f(nal_unit_type), NalUnitType),
    NalUnitType #= 5.

calculate(f(dIdrPicFlag), 0) :-
    domain(f(nal_unit_type), NalUnitType),
    NalUnitType #\= 5.

calculate(f(dDepthFlag), 0) :-
    domain(f(nal_unit_type), NalUnitType),
    NalUnitType #\= 21.

calculate(f(dDepthFlag), DepthFlag) :-
    domain(f(nal_unit_type), 21),
    domain(f(avc_3d_extension_flag), 1),
    domain(f(depth_flag), DepthFlag).

calculate(f(dDepthFlag), 1) :-
    domain(f(nal_unit_type), 21),
    domain(f(avc_3d_extension_flag), 0).

calculate(f(dChromaArrayType), ChromaFormatIdc) :-
    domain(f(separate_colour_plane_flag), 0),
    domain(f(chroma_format_idc), ChromaFormatIdc).

calculate(f(dChromaArrayType), 0) :-
    domain(f(separate_colour_plane_flag), 1).

calculate(f(dBitDepthY), Value) :-
    domain(f(bit_depth_luma_minus8), BitDepthLumaMinus8),
    Value #= 8 + BitDepthLumaMinus8.

calculate(f(dQpBdOffsetY), Value) :-
    domain(f(bit_depth_luma_minus8), BitDepthLumaMinus8),
    Value #= 6 * BitDepthLumaMinus8.

calculate(f(dBitDepthC), Value) :-
    domain(f(bit_depth_chroma_minus8), BitDepthChromaMinus8),
    Value #= 8 + BitDepthChromaMinus8.

calculate(f(dQpBdOffsetC), Value) :-
    domain(f(bit_depth_chroma_minus8), BitDepthChromaMinus8),
    Value #= 6 * BitDepthChromaMinus8.

calculate(f(dRawMbBits), Value) :-
    domain(f(dBitDepthY), BitDepthY),
    domain(f(dMbWidthC), MbWidthC),
    domain(f(dMbHeightC), MbHeightC),
    domain(f(dBitDepthC), BitDepthC),
    Value #= 256 * BitDepthY + 2 * MbWidthC * MbHeightC * BitDepthC.

calculate(f(dFlat_4x4_16(K)), 16) :-
  K #&gt;= 0, K #&lt; 16.

calculate(f(dFlat_8x8_16(K)), 16) :-
  K #&gt;= 0, K #&lt; 64.

calculate(f(dMaxFrameNum), Value) :-
    domain(f(log2_max_frame_num_minus4), Log2Max),
    Exp #= Log2Max + 4,
    Value #= 2^Exp.

calculate(f(dMaxPicOrderCntLsb), Value) :-
    domain(f(log2_max_pic_order_cnt_lsb_minus4), Log2Max),
    Exp #= Log2Max + 4,
    Value #= 2^Exp.

calculate(f(dExpectedDeltaPerPicOrderCntCycle), Sum) :-
    domain(f(num_ref_frames_in_pic_order_cnt_cycle), N),
    sum_offsets(0, N, Sum).

calculate(f(dPicWidthInMbs), Value) :-
    domain(f(pic_width_in_mbs_minus1), PicWidthMinus1),
    Value #= PicWidthMinus1 + 1.

calculate(f(dPicWidthInSamplesL), Value) :-
    domain(f(dPicWidthInMbs), PicWidthInMbs),
    Value #= PicWidthInMbs * 16.

calculate(f(dPicWidthInSamplesC), Value) :-
    domain(f(dPicWidthInMbs), PicWidthInMbs),
    domain(f(dMbWidthC), MbWidthC),
    Value #= PicWidthInMbs * MbWidthC.

calculate(f(dPicHeightInMapUnits), Value) :-
    domain(f(pic_height_in_map_units_minus1), PicHeightMinus1),
    Value #= PicHeightMinus1 + 1.

calculate(f(dPicSizeInMapUnits), Value) :-
    domain(f(dPicWidthInMbs), PicWidthInMbs),
    domain(f(dPicHeightInMapUnits), PicHeightInMapUnits),
    Value #= PicWidthInMbs * PicHeightInMapUnits.

calculate(f(dFrameHeightInMbs), Value) :-
    domain(f(frame_mbs_only_flag), FrameMbsOnlyFlag),
    domain(f(dPicHeightInMapUnits), PicHeightInMapUnits),
    Value #= (2 - FrameMbsOnlyFlag) * PicHeightInMapUnits.

calculate(f(dCropUnitX), 1) :-
    domain(f(dChromaArrayType), ChromaArrayType),
    ChromaArrayType #= 0.

calculate(f(dCropUnitX), SubWidthC) :-
    domain(f(dChromaArrayType), ChromaArrayType),
    ChromaArrayType #\= 0,
    domain(f(dSubWidthC), SubWidthC).

calculate(f(dCropUnitY), Val) :-
    domain(f(dChromaArrayType), 0),
    domain(f(frame_mbs_only_flag), FrameMbsOnlyFlag),
    Val #= 2 - FrameMbsOnlyFlag.

calculate(f(dCropUnitY), Val) :-
    domain(f(dChromaArrayType), ChromaArrayType),
    ChromaArrayType #\= 0,
    domain(f(dSubHeightC), SubHeightC),
    domain(f(frame_mbs_only_flag), FrameMbsOnlyFlag),
    Val #= SubHeightC * (2 - FrameMbsOnlyFlag).

calculate(f(dCroppedWidthL), Val) :-
    domain(f(dPicWidthInSamplesL), PicWidthInSamples),
    domain(f(dCropUnitX), CropUnitX),
    domain(f(frame_crop_left_offset), LeftOffset),
    domain(f(frame_crop_right_offset), RightOffset),
    Val #= PicWidthInSamples - CropUnitX * (LeftOffset + RightOffset).

calculate(f(dCroppedWidthC), Val) :-
    domain(f(dPicWidthInSamplesC), PicWidthInSamples),
    domain(f(dCropUnitX), CropUnitX),
    domain(f(frame_crop_left_offset), LeftOffset),
    domain(f(frame_crop_right_offset), RightOffset),
    Val #= PicWidthInSamples - CropUnitX * (LeftOffset + RightOffset).

calculate(f(dCroppedHeight), Val) :-
    domain(f(dFrameHeightInMbs), FrameHeightInMbs),
    domain(f(dCropUnitY), CropUnitY),
    domain(f(frame_crop_top_offset), TopOffset),
    domain(f(frame_crop_bottom_offset), BottomOffset),
    Val #= 16 * FrameHeightInMbs - CropUnitY * (TopOffset + BottomOffset).

calculate(f(dSliceGroupChangeRate), Val) :-
    domain(f(slice_group_change_rate_minus1), RateMinus1),
    Val #= RateMinus1 + 1.

calculate(f(dMbaffFrameFlag), 1) :-
    domain(f(mb_adaptive_frame_field_flag), Mbaff),
    Mbaff #= 1,
    domain(f(field_pic_flag), FieldPic),
    FieldPic #= 0.

calculate(f(dMbaffFrameFlag), 0) :-
    domain(f(mb_adaptive_frame_field_flag), Mbaff),
    domain(f(field_pic_flag), FieldPic),
    (Mbaff #= 0; FieldPic #= 1).

calculate(f(dPicHeightInMbs), Val) :-
    domain(f(dFrameHeightInMbs), FrameHeightInMbs),
    domain(f(field_pic_flag), FieldPicFlag),
    Val #= FrameHeightInMbs // (1 + FieldPicFlag).

calculate(f(dPicHeightInSamplesL), Val) :-
    domain(f(dPicHeightInMbs), PicHeightInMbs),
    Val #= PicHeightInMbs * 16.

calculate(f(dPicHeightInSamplesC), Val) :-
    domain(f(dPicHeightInMbs), PicHeightInMbs),
    domain(f(dMbHeightC), MbHeightC),
    Val #= PicHeightInMbs * MbHeightC.

calculate(f(dPicSizeInMbs), Val) :-
    domain(f(dPicWidthInMbs), PicWidthInMbs),
    domain(f(dPicHeightInMbs), PicHeightInMbs),
    Val #= PicWidthInMbs * PicHeightInMbs.

calculate(f(dMaxPicNum), MaxFrameNum) :-
    domain(f(field_pic_flag), FieldPicFlag),
    FieldPicFlag #= 0,
    domain(f(dMaxFrameNum), MaxFrameNum).

calculate(f(dMaxPicNum), Val) :-
    domain(f(field_pic_flag), FieldPicFlag),
    FieldPicFlag #= 1,
    domain(f(dMaxFrameNum), MaxFrameNum),
    Val #= 2 * MaxFrameNum.

calculate(f(dCurrPicNum), FrameNum) :-
    domain(f(field_pic_flag), FieldPicFlag),
    FieldPicFlag #= 0,
    domain(f(frame_num), FrameNum).

calculate(f(dCurrPicNum), Val) :-
    domain(f(field_pic_flag), FieldPicFlag),
    FieldPicFlag #= 1,
    domain(f(frame_num), FrameNum),
    Val #= 2 * FrameNum + 1.

calculate(f(dSliceQPY), Val) :-
    domain(f(pic_init_qp_minus26), PicInitQp),
    domain(f(slice_qp_delta), SliceQpDelta),
    Val #= 26 + PicInitQp + SliceQpDelta.

calculate(f(dQSY), Val) :-
    domain(f(pic_init_qs_minus26), PicInitQs),
    domain(f(slice_qs_delta), SliceQsDelta),
    Val #= 26 + PicInitQs + SliceQsDelta.

calculate(f(dFilterOffsetA), Val) :-
    domain(f(slice_alpha_c0_offset_div2), OffsetDiv2),
    Val #= OffsetDiv2 * 2.

calculate(f(dFilterOffsetB), Val) :-
    domain(f(slice_beta_offset_div2), OffsetDiv2),
    Val #= OffsetDiv2 * 2.

calculate(f(dMapUnitsInSliceGroup0), Val) :-
    domain(f(slice_group_change_cycle), Cycle),
    domain(f(dSliceGroupChangeRate), Rate),
    domain(f(dPicSizeInMapUnits), PicSize),
    Term1 #= Cycle * Rate,
    Val #= min(Term1, PicSize).

calculate(f(dCodedBlockPatternLuma), Val) :-
    domain(f(coded_block_pattern), Cbp),
    Val #= Cbp mod 16.

calculate(f(dCodedBlockPatternChroma), Val) :-
    domain(f(coded_block_pattern), Cbp),
    Val #= Cbp // 16.

calculate(f(dSubWidthC), 2) :-
    domain(f(chroma_format_idc), 1),
    domain(f(separate_colour_plane_flag), 0).

calculate(f(dSubWidthC), 2) :-
    domain(f(chroma_format_idc), 2),
    domain(f(separate_colour_plane_flag), 0).

calculate(f(dSubWidthC), 1) :-
    domain(f(chroma_format_idc), 3),
    domain(f(separate_colour_plane_flag), 0).

calculate(f(dSubHeightC), 2) :-
    domain(f(chroma_format_idc), 1),
    domain(f(separate_colour_plane_flag), 0).

calculate(f(dSubHeightC), 1) :-
    domain(f(chroma_format_idc), 2),
    domain(f(separate_colour_plane_flag), 0).

calculate(f(dSubHeightC), 1) :-
    domain(f(chroma_format_idc), 3),
    domain(f(separate_colour_plane_flag), 0).

calculate(f(dQpy), Qpy) :-
    domain(f(dQpyPrev), QpyPrev),
    domain(f(mb_qp_delta), MbQpDelta),
    domain(f(dQpBdOffsetY), QpBdOffsetY),
    Qpy #= ( ( QpyPrev + MbQpDelta + 52 + 2 * QpBdOffsetY ) mod ( 52 + QpBdOffsetY ) ) - QpBdOffsetY.

calculate(f(dQpPrimeY), QpPrimeY) :-
    domain(f(dQpy), Qpy),
    domain(f(dQpBdOffsetY), QpBdOffsetY),
    QpPrimeY #= Qpy + QpBdOffsetY.

calculate(f(dTransformBypassModeFlag), 1) :-
    domain(f(qpprime_y_zero_transform_bypass_flag), Flag),
    Flag #= 1,
    domain(f(dQpPrimeY), QpPrimeY),
    QpPrimeY #= 0.

calculate(f(dTransformBypassModeFlag), 0) :-
    domain(f(qpprime_y_zero_transform_bypass_flag), Flag),
    Flag #= 0.

calculate(f(dTransformBypassModeFlag), 0) :-
    domain(f(dQpPrimeY), QpPrimeY),
    QpPrimeY #\= 0.

calculate(f(chroma_weight_l0(_I, _J)), X) :-
    domain(f(chroma_weight_l0_flag), Flag),
    Flag #= 0,
    domain(f(chroma_log2_weight_denom), Denom),
    X #= 2^Denom.

calculate(f(chroma_offset_l0(_I, _J)), X) :-
    domain(f(chroma_weight_l0_flag), Flag),
    Flag #= 0,
    X #= 0.

calculate(f(dMbPartPredMode(mb_type, 0)), Value) :-
    domain(f(mb_type), MbType),
    (   MbType = 0 -&gt; Value = 'Direct'                    % B_Direct_16x16
    ;   between(1, 3, MbType) -&gt; Value = 'Pred_L0'        % B_L0_16x16, B_L1_16x16, B_Bi_16x16
    ;   between(4, 5, MbType) -&gt; Value = 'Pred_L0'        % B_L0_L0_16x8, B_L0_L0_8x16
    ;   between(6, 7, MbType) -&gt; Value = 'Pred_L1'        % B_L1_L1_16x8, B_L1_L1_8x16
    ;   between(8, 9, MbType) -&gt; Value = 'Pred_L0'        % B_L0_L1_16x8, B_L0_L1_8x16
    ;   between(10, 11, MbType) -&gt; Value = 'Pred_L1'      % B_L1_L0_16x8, B_L1_L0_8x16
    ;   between(12, 13, MbType) -&gt; Value = 'Pred_L0'      % B_L0_Bi_16x8, B_L0_Bi_8x16
    ;   between(14, 15, MbType) -&gt; Value = 'Pred_L1'      % B_L1_Bi_16x8, B_L1_Bi_8x16
    ;   between(16, 17, MbType) -&gt; Value = 'BiPred'       % B_Bi_L0_16x8, B_Bi_L0_8x16
    ;   between(18, 19, MbType) -&gt; Value = 'BiPred'       % B_Bi_L1_16x8, B_Bi_L1_8x16
    ;   between(20, 21, MbType) -&gt; Value = 'BiPred'       % B_Bi_Bi_16x8, B_Bi_Bi_8x16
    ).

calculate(f(dMbPartPredMode(mb_type, 1)), Value) :-
    domain(f(mb_type), MbType),
    (   between(4, 5, MbType) -&gt; Value = 'Pred_L0'        % B_L0_L0_16x8, B_L0_L0_8x16
    ;   between(6, 7, MbType) -&gt; Value = 'Pred_L1'        % B_L1_L1_16x8, B_L1_L1_8x16
    ;   MbType = 8 -&gt; Value = 'Pred_L1'                   % B_L0_L1_16x8
    ;   MbType = 9 -&gt; Value = 'Pred_L1'                   % B_L0_L1_8x16
    ;   MbType = 10 -&gt; Value = 'Pred_L0'                  % B_L1_L0_16x8
    ;   MbType = 11 -&gt; Value = 'Pred_L0'                  % B_L1_L0_8x16
    ;   between(12, 13, MbType) -&gt; Value = 'BiPred'       % B_L0_Bi_16x8, B_L0_Bi_8x16
    ;   between(14, 15, MbType) -&gt; Value = 'BiPred'       % B_L1_Bi_16x8, B_L1_Bi_8x16
    ;   between(16, 17, MbType) -&gt; Value = 'Pred_L0'      % B_Bi_L0_16x8, B_Bi_L0_8x16
    ;   between(18, 19, MbType) -&gt; Value = 'Pred_L1'      % B_Bi_L1_16x8, B_Bi_L1_8x16
    ;   between(20, 21, MbType) -&gt; Value = 'BiPred'       % B_Bi_Bi_16x8, B_Bi_Bi_8x16
    ;   Value = 'na'  % For mb_types with only one part or B_8x8
    ).

calculate(f(dMbPartPredMode(mb_type, 0)), Value) :-
    domain(f(mb_type), MbType),
    (   MbType = 0 -&gt; 
        domain(f(transform_size_8x8_flag), Flag),
        (   Flag = 0 -&gt; Value = 'Intra_4x4'
        ;   Flag = 1 -&gt; Value = 'Intra_8x8'
        )
    ;   between(1, 24, MbType) -&gt; Value = 'Intra_16x16'   % I_16x16_* cases
    ;   MbType = 25 -&gt; Value = 'na'                       % I_PCM
    ).

calculate(f(dMbPartPredMode(mb_type, 1)), 'na') :-
    domain(f(mb_type), MbType),
    between(0, 25, MbType).  % Any valid I-slice mb_type

calculate(f(residual(_StartIdx, _EndIdx), dResidualBlock), residual_block_cavlc) :-
    domain(f(entropy_coding_mode_flag), Flag),
    Flag #= 0.

calculate(f(residual(_StartIdx, _EndIdx), dResidualBlock), residual_block_cabac) :-
    domain(f(entropy_coding_mode_flag), Flag),
    Flag #= 1.

calculate(f(residual, dLumaLevel8x8), 'DERIVED').

calculate(f(residual, dNumC8x8), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT),
    (CAT #= 1; CAT #= 2).

calculate(f(residual, dCbIntra16x16DCLevel), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT), CAT #= 3.

calculate(f(residual, dCbIntra16x16ACLevel), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT), CAT #= 3.

calculate(f(residual, dCbLevel4x4), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT), CAT #= 3.

calculate(f(residual, dCbLevel8x8), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT), CAT #= 3.

calculate(f(residual, dCrIntra16x16DCLevel), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT), CAT #= 3.

calculate(f(residual, dCrIntra16x16ACLevel), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT), CAT #= 3.

calculate(f(residual, dCrLevel4x4), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT), CAT #= 3.

calculate(f(residual, dCrLevel8x8), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT), CAT #= 3.

calculate(f(slice_data, dPrevMbSkipped), derived) :-
    domain(f(dMoreDataFlag), MoreDataFlag), MoreDataFlag #= 1,
    domain(f(slice_type), SliceType), \+ member(SliceType, [i, si]),
    domain(f(entropy_coding_mode_flag), EntropyFlag), EntropyFlag #= 0.

calculate(f(slice_data, dCurrMbAddr), derived) :-
    domain(f(dMoreDataFlag), MoreDataFlag), MoreDataFlag #= 1,
    domain(f(slice_type), SliceType), \+ member(SliceType, [i, si]),
    domain(f(entropy_coding_mode_flag), EntropyFlag), EntropyFlag #= 0,
    domain(f(mb_skip_run), MbSkipRun), domain(f(mb_skip_run), MbSkipRun), MbSkipRun #&gt; 0.

calculate(f(slice_data, dMoreDataFlag), derived) :-
    domain(f(dMoreDataFlag), MoreDataFlag), MoreDataFlag #= 1,
    domain(f(slice_type), SliceType), \+ member(SliceType, [i, si]),
    domain(f(entropy_coding_mode_flag), EntropyFlag), EntropyFlag #= 0,
    domain(f(mb_skip_run), MbSkipRun), MbSkipRun #&gt; 0.

calculate(f(slice_data, dMoreDataFlag), derived) :-
    domain(f(dMoreDataFlag), MoreDataFlag), MoreDataFlag #= 1,
    domain(f(slice_type), SliceType), \+ member(SliceType, [i, si]),
    domain(f(entropy_coding_mode_flag), EntropyFlag), EntropyFlag #= 1.

calculate(f(slice_data, dMoreDataFlag), derived) :-
    domain(f(dMoreDataFlag), MoreDataFlag), MoreDataFlag #= 1,
    domain(f(entropy_coding_mode_flag), EntropyFlag), EntropyFlag #= 0.

calculate(f(slice_data, dPrevMbSkipped), derived) :-
    domain(f(dMoreDataFlag), MoreDataFlag), MoreDataFlag #= 1,
    domain(f(entropy_coding_mode_flag), EntropyFlag), EntropyFlag #= 1,
    domain(f(slice_type), SliceType), \+ member(SliceType, [i, si]).

calculate(f(slice_data, dMoreDataFlag), derived) :-
    domain(f(dMoreDataFlag), MoreDataFlag), MoreDataFlag #= 1,
    domain(f(entropy_coding_mode_flag), EntropyFlag), EntropyFlag #= 1,
    domain(f(mbaff_frame_flag), Mbaff), Mbaff #= 1,
    domain(f(dCurrMbAddr), CurrMbAddr), (CurrMbAddr mod 2) #= 0.

calculate(f(slice_data, dMoreDataFlag), derived) :-
    domain(f(dMoreDataFlag), MoreDataFlag), MoreDataFlag #= 1,
    domain(f(entropy_coding_mode_flag), EntropyFlag), EntropyFlag #= 1,
    (domain(f(mbaff_frame_flag), Mbaff), Mbaff #= 0; (domain(f(dCurrMbAddr), CurrMbAddr), (CurrMbAddr mod 2) #\= 0)).

calculate(f(slice_data, dCurrMbAddr), derived) :-
    domain(f(dMoreDataFlag), MoreDataFlag), MoreDataFlag #= 1.

calculate(f(residual_luma, residual_block(I8x8)), residual_block) :-
    I8x8 in 0..3,
    domain(f(transform_size_8x8_flag), T8x8), T8x8 #= 1,
    domain(f(entropy_coding_mode_flag), Ecm), Ecm #= 1,
    domain(f(coded_block_pattern), Cbp),
    CbpLuma #= Cbp mod 16,
    (CbpLuma &gt;&gt; I8x8) mod 2 #= 1.

calculate(f(pic_parameter_set_rbsp, scaling_list(I)), scaling_list) :-
    domain(f(dPicScalingListCount), N), I #&gt;= 0, I #&lt; N,
    domain(f(pic_scaling_matrix_present_flag), Psmpf), Psmpf #= 1,
    domain(f(pic_scaling_list_present_flag(I)), Pslpf), Pslpf #= 1,
    I #&lt; 6.

calculate(f(pic_parameter_set_rbsp, scaling_list(I)), scaling_list) :-
    domain(f(dPicScalingListCount), N), I #&gt;= 0, I #&lt; N,
    domain(f(pic_scaling_matrix_present_flag), Psmpf), Psmpf #= 1,
    domain(f(pic_scaling_list_present_flag(I)), Pslpf), Pslpf #= 1,
    I #&gt;= 6.

calculate(f(pic_parameter_set_rbsp, rbsp_trailing_bits), rbsp_trailing_bits).

calculate(f(seq_parameter_set_data, scaling_list(I)), scaling_list) :-
    domain(f(dSeqScalingListCount), N), I #&gt;= 0, I #&lt; N,
    domain(f(profile_idc), Pidc), member(Pidc, [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135]),
    domain(f(seq_scaling_matrix_present_flag), Ssm), Ssm #= 1,
    domain(f(seq_scaling_list_present_flag(I)), Ssl), Ssl #= 1,
    I #&lt; 6.

calculate(f(seq_parameter_set_data, scaling_list(I)), scaling_list) :-
    domain(f(dSeqScalingListCount), N), I #&gt;= 0, I #&lt; N,
    domain(f(profile_idc), Pidc), member(Pidc, [100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135]),
    domain(f(seq_scaling_matrix_present_flag), Ssm), Ssm #= 1,
    domain(f(seq_scaling_list_present_flag(I)), Ssl), Ssl #= 1,
    I #&gt;= 6.

calculate(f(seq_parameter_set_data, vui_parameters), vui_parameters) :-
    domain(f(vui_parameters_present_flag), Vppf), Vppf #= 1.

calculate(f(slice_data_partition_b_layer_rbsp, slice_data), slice_data).

calculate(f(slice_data_partition_b_layer_rbsp, rbsp_slice_trailing_bits), rbsp_slice_trailing_bits).

calculate(f(slice_layer_without_partitioning_rbsp, slice_header), slice_header).

calculate(f(slice_layer_without_partitioning_rbsp, slice_data), slice_data).

calculate(f(slice_layer_without_partitioning_rbsp, rbsp_slice_trailing_bits), rbsp_slice_trailing_bits).

calculate(f(residual_block_cavlc, dLevelVal(I)), Val) :-
    domain(f(dTotalCoeff), N), I #&gt;= 0, I #&lt; N,
    domain(f(dTotalCoeff), TC), TC #&gt; 0,
    domain(f(dTrailingOnes), TO), I #&lt; TO,
    domain(f(level_suffix(I)), Suffix),
    Val #= 1 - 2 * Suffix.

calculate(f(slice_layer_extension_rbsp, slice_header), slice_header) :-
    domain(f(svc_extension_flag), SvcFlag), SvcFlag #= 0,
    domain(f(avc_3d_extension_flag), Avc3dFlag), Avc3dFlag #= 0.

calculate(f(slice_layer_extension_rbsp, slice_data), slice_data) :-
    domain(f(svc_extension_flag), SvcFlag), SvcFlag #= 0,
    domain(f(avc_3d_extension_flag), Avc3dFlag), Avc3dFlag #= 0.

calculate(f(nal_unit, dNumBytesInRBSP), 'DERIVED').

calculate(f(nal_unit, dNalUnitHeaderBytes), 1) :-
    domain(f(nal_unit_type), NalUnitType),
    \+ member(NalUnitType, [14, 20, 21]).

calculate(f(nal_unit, dNalUnitHeaderBytes), 4) :-
    domain(f(nal_unit_type), NalUnitType),
    member(NalUnitType, [14, 20, 21]).

calculate(f(nal_unit, nal_unit_header_svc_extension), nal_unit_header_svc_extension) :-
    domain(f(nal_unit_type), NalUnitType), member(NalUnitType, [14, 20, 21]),
    domain(f(svc_extension_flag), SvcFlag), SvcFlag #= 1.

calculate(f(nal_unit, nal_unit_header_3davc_extension), nal_unit_header_3davc_extension) :-
    domain(f(nal_unit_type), NalUnitType), member(NalUnitType, [14, 20, 21]),
    domain(f(svc_extension_flag), SvcFlag), SvcFlag #= 0,
    domain(f(avc_3d_extension_flag), Avc3dFlag), Avc3dFlag #= 1.

calculate(f(nal_unit, nal_unit_header_mvc_extension), nal_unit_header_mvc_extension) :-
    domain(f(nal_unit_type), NalUnitType), member(NalUnitType, [14, 20, 21]),
    domain(f(svc_extension_flag), SvcFlag), SvcFlag #= 0,
    domain(f(avc_3d_extension_flag), Avc3dFlag), Avc3dFlag #= 0.

calculate(f(slice_header, ref_pic_list_mvc_modification), ref_pic_list_mvc_modification) :-
    domain(f(nal_unit_type), NalUnitType),
    member(NalUnitType, [20, 21]).

calculate(f(slice_header, ref_pic_list_modification), ref_pic_list_modification) :-
    domain(f(nal_unit_type), NalUnitType),
    \+ member(NalUnitType, [20, 21]).

calculate(f(slice_header, pred_weight_table), pred_weight_table) :-
    domain(f(weighted_pred_flag), WpFlag), WpFlag #= 1,
    domain(f(slice_type), SliceType),
    ( (SliceType mod 5) #= 0; (SliceType mod 5) #= 1 ).

calculate(f(slice_header, pred_weight_table), pred_weight_table) :-
    domain(f(weighted_bipred_idc), WbIdc), WbIdc #= 1,
    domain(f(slice_type), SliceType),
    (SliceType mod 5) #= 2.

calculate(f(slice_header, dec_ref_pic_marking), dec_ref_pic_marking) :-
    domain(f(nal_ref_idc), NalRefIdc),
    NalRefIdc #\= 0.

calculate(f(sei_rbsp, sei_message), sei_message) :-
    domain(f(dMoreRbspData), MoreData),
    MoreData #= 1.

calculate(f(residual, dChromaDCLevel(_ICbCr, _I)), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT), (CAT #= 1; CAT #= 2),
    domain(f(dCodedBlockPatternChroma), CBP),
    domain(f(startIdx), StartIdx),
    \+ ((CBP /\ 3) #\= 0, StartIdx #= 0).

calculate(f(residual_luma, dI16x16acLevel(Idx, I)), 0) :-
    f(dI16x16acLevel(Idx, I)),
    (domain(f(transform_size_8x8_flag), T8x8), T8x8 #= 0; domain(f(entropy_coding_mode_flag), Ecm), Ecm #= 0),
    I8x8 #= Idx // 4,
    domain(f(dCodedBlockPatternLuma), Cbp), (Cbp /\ (1 &lt;&lt; I8x8)) #= 0,
    domain(f(mb_type), MbType), mb_part_pred_mode_is_intra16x16(MbType).

calculate(f(residual_luma, dLevel4x4(Idx, I)), 0) :-
    f(dLevel4x4(Idx, I)),
    (domain(f(transform_size_8x8_flag), T8x8), T8x8 #= 0; domain(f(entropy_coding_mode_flag), Ecm), Ecm #= 0),
    I8x8 #= Idx // 4,
    domain(f(dCodedBlockPatternLuma), Cbp), (Cbp /\ (1 &lt;&lt; I8x8)) #= 0,
    domain(f(mb_type), MbType), \+ mb_part_pred_mode_is_intra16x16(MbType).

calculate(f(residual_luma, dLevel8x8(I8x8, Idx)), 0) :-
    f(dLevel8x8(I8x8, Idx)),
    domain(f(transform_size_8x8_flag), T8x8), T8x8 #= 1,
    domain(f(entropy_coding_mode_flag), Ecm), Ecm #= 0.

calculate(f(residual_luma, dLevel8x8(I8x8, I)), 0) :-
    I8x8 in 0..3, I in 0..63,
    domain(f(transform_size_8x8_flag), T8x8), T8x8 #= 1,
    domain(f(entropy_coding_mode_flag), Ecm), Ecm #= 1,
    domain(f(coded_block_pattern), Cbp),
    CbpLuma #= Cbp mod 16,
    (CbpLuma &gt;&gt; I8x8) mod 2 #= 0.

calculate(f(residual, dChromaACLevel(_ICbCr, _I8x8, _I4x4, _I)), 'DERIVED') :-
    domain(f(dChromaArrayType), CAT), (CAT #= 1; CAT #= 2),
    domain(f(dCodedBlockPatternChroma), CBP),
    (CBP /\ 2) #= 0.

% constraints/1 
constraints(f(ff_byte), X) :-
  X #= 0xFF.

constraints(f(luma_log2_weight_denom), X) :-
  X in 0..7.

constraints(f(chroma_log2_weight_denom), X) :-
  X in 0..7.

constraints(f(luma_weight_l0(_I)), X) :-
  X in -128..127.

constraints(f(luma_offset_l0(_I)), X) :-
  X in -128..127.

constraints(f(pcm_alignment_zero_bit), X) :-
  X #= 0.

constraints(f(coded_block_pattern), _X) :-
    domain(f(dChromaArrayType), CAT),
    (CAT #= 0 ; CAT #= 3),
    domain(f(dCodedBlockPatternChroma), CBPC),
    CBPC #= 0.

constraints(f(bit_equal_to_one), X) :-
  X #= 1.

constraints(f(additional_extension2_flag), X) :-
  X #= 0.

constraints(f(delta_scale(_J)), X) :-
  X in -128..127.

constraints(f(seq_parameter_set_id), X) :-
  X in 0..31.

constraints(f(aux_format_idc), X) :-
  X in 0..3.

constraints(f(bit_depth_aux_minus8), X) :-
  X in 0..4.

constraints(f(additional_extension_flag), X) :-
  X #= 0.

constraints(f(colour_plane_id), X) :-
  X in 0..2.

constraints(f(redundant_pic_cnt), X) :-
  X in 0..127.

constraints(f(abs_diff_pic_num_minus1), X) :-
    domain(f(dMaxPicNum), MaxPicNumVal),
    X in 0..(MaxPicNumVal - 1).

constraints(f(intra_chroma_pred_mode), X) :-
  X in 0..3.

constraints(f(cabac_zero_word), X) :-
  X #= 0.

constraints(f(long_term_frame_idx), X) :-
    domain(f(dMaxLongTermFrameIdx), MaxLongTermFrameIdxVal),
    X in 0..MaxLongTermFrameIdxVal.

constraints(f(max_long_term_frame_idx_plus1), X) :-
    domain(f(dMaxNumRefFrames), MaxNumRefFramesVal),
    X in 0..MaxNumRefFramesVal.

constraints(f(cabac_alignment_one_bit), X) :-
  X #= 1.

constraints(f(mb_skip_run), X) :-
    domain(f(dPicSizeInMbs), P),
    domain(f(curr_mb_addr), C),
    X in 0..(P - C).

constraints(f(pic_parameter_set_id), X) :-
  X in 0..255.

constraints(f(slice_group_map_type), X) :-
  X in 0..6.

constraints(f(slice_group_map_type), X) :-
    domain(f(num_slice_groups_minus1), N), N #\= 1,
    X #\= 3, X #\= 4, X #\= 5.

constraints(f(slice_group_change_rate_minus1), X) :-
    domain(f(dPicSizeInMapUnits), P),
    X in 0..(P - 1).

constraints(f(pic_size_in_map_units_minus1), X) :-
    domain(f(dPicSizeInMapUnits), P),
    X #= P - 1.

constraints(f(slice_group_id(_I)), X) :-
    domain(f(num_slice_groups_minus1), N),
    X in 0..N.

constraints(f(chroma_format_idc), X) :-
  X in 0..3.

constraints(f(num_ref_idx_l0_default_active_minus1), X) :-
  X in 0..31.

constraints(f(num_ref_idx_l1_default_active_minus1), X) :-
  X in 0..31.

constraints(f(weighted_bipred_idc), X) :-
  X in 0..2.

constraints(f(pic_init_qs_minus26), X) :-
  X in -26..25.

constraints(f(chroma_qp_index_offset), X) :-
  X in -12..12.

constraints(f(second_chroma_qp_index_offset), X) :-
  X in -12..12.

constraints(f(constraint_set0_flag), X) :-
    domain(f(profile_idc), ProfileIdc),
    (member(ProfileIdc, [44, 100, 110, 122, 244]) -&gt; X #= 0; true).

constraints(f(constraint_set1_flag), X) :-
    domain(f(profile_idc), ProfileIdc),
    (member(ProfileIdc, [44, 100, 110, 122, 244]) -&gt; X #= 0; true).

constraints(f(constraint_set2_flag), X) :-
    domain(f(profile_idc), ProfileIdc),
    (member(ProfileIdc, [44, 100, 110, 122, 244]) -&gt; X #= 0; true).

constraints(f(constraint_set3_flag), X) :-
    domain(f(profile_idc), ProfileIdc),
    (ProfileIdc #= 44 -&gt; X #= 1; X #= 0).

constraints(f(constraint_set4_flag), X) :-
    domain(f(profile_idc), ProfileIdc),
    \+ member(ProfileIdc, [77, 88, 100, 110, 118, 128, 134]),
    X #= 0.

constraints(f(reserved_zero_2bits), X) :-
  X #= 0.

constraints(f(chroma_format_idc), X) :-
  X in 0..3.

constraints(f(bit_depth_luma_minus8), X) :-
  X in 0..6.

constraints(f(bit_depth_chroma_minus8), X) :-
  X in 0..6.

constraints(f(log2_max_frame_num_minus4), X) :-
  X in 0..12.

constraints(f(pic_order_cnt_type), X) :-
  X in 0..2.

constraints(f(log2_max_pic_order_cnt_lsb_minus4), X) :-
  X in 0..12.

constraints(f(offset_for_non_ref_pic), X) :-
  X in -2147483647..2147483647.

constraints(f(offset_for_top_to_bottom_field), X) :-
  X in -2147483647..2147483647.

constraints(f(num_ref_frames_in_pic_order_cnt_cycle), X) :-
  X in 0..255.

constraints(f(offset_for_ref_frame(_)), X) :-
  X in -2147483647..2147483647.

constraints(f(direct_8x8_inference_flag), X) :-
    domain(f(frame_mbs_only_flag), Flag), Flag #= 0, X #= 1.

constraints(f(delta_pic_order_cnt(1)), X) :-
  Min #= -2147483647, Max #= 2147483647, X in Min..Max.

constraints(f(rbsp_stop_one_bit), X) :-
  X #= 1.

constraints(f(rbsp_alignment_zero_bit), X) :-
  X #= 0.

constraints(f(frame_mbs_only_flag), X) :-
  X in 0..1.

constraints(f(mb_adaptive_frame_field_flag), X) :-
  X in 0..1.

constraints(f(field_pic_flag), X) :-
  X in 0..1.

constraints(f(qpprime_y_zero_transform_bypass_flag), X) :-
  X in 0..1.

constraints(f(chroma_weight_l0(_I, _J)), X) :-
  X in -128..127.

constraints(f(chroma_offset_l0(_I, _J)), X) :-
  X in -128..127.

constraints(f(mvd_l0(_, _)), X) :-
  X in -8192..8191.

% default_value/1 
default_value(f(transform_size_8x8_flag), 0).

default_value(f(mb_qp_delta), 0).

default_value(f(aux_format_idc), 0).

default_value(f(redundant_pic_cnt), 0).

default_value(f(ref_idx_l0(_)), 0).

default_value(f(ref_idx_l1(_)), 0).

default_value(f(mb_field_decoding_flag), field_pic_flag). % Part of the default value description

default_value(f(transform_8x8_mode_flag), 0).

default_value(f(pic_scaling_matrix_present_flag), 0).

default_value(f(second_chroma_qp_index_offset), f(chroma_qp_index_offset)).

default_value(f(chroma_format_idc), 1).

default_value(f(separate_colour_plane_flag), 0).

default_value(f(bit_depth_luma_minus8), 0).

default_value(f(bit_depth_chroma_minus8), 0).

default_value(f(qpprime_y_zero_transform_bypass_flag), 0).

default_value(f(seq_scaling_matrix_present_flag), 0).

default_value(f(delta_pic_order_cnt(1)), 0).

default_value(f(num_ref_idx_l0_active_minus1), dNumRefIdxL0DefaultActiveMinus1).

default_value(f(num_ref_idx_l1_active_minus1), dNumRefIdxL1DefaultActiveMinus1).

default_value(f(disable_deblocking_filter_idc), 0).

default_value(f(slice_alpha_c0_offset_div2), 0).

default_value(f(slice_beta_offset_div2), 0).

default_value(f(sub_mb_type(_)), dSubMbTypeDefault).

% depends_on/1 %
depends_on(f(ff_byte), []).

depends_on(f(chroma_log2_weight_denom), [f(dChromaArrayType)]).

depends_on(f(luma_weight_l0_flag), [f(num_ref_idx_l0_active_minus1)]).

depends_on(f(luma_weight_l0(_I)), [f(num_ref_idx_l0_active_minus1), f(luma_weight_l0_flag), f(luma_log2_weight_denom)]).

depends_on(f(luma_offset_l0(_I)), [f(num_ref_idx_l0_active_minus1), f(luma_weight_l0_flag)]).

depends_on(f(chroma_weight_l0_flag), [f(num_ref_idx_l0_active_minus1), f(luma_weight_l0_flag), f(dChromaArrayType)]).

depends_on(f(luma_weight_l1_flag(_I)), [f(slice_type), f(num_ref_idx_l1_active_minus1)]).

depends_on(f(luma_weight_l1(I)), [f(slice_type), f(num_ref_idx_l1_active_minus1), f(luma_weight_l1_flag(I))]).

depends_on(f(luma_offset_l1(I)), [f(slice_type), f(num_ref_idx_l1_active_minus1), f(luma_weight_l1_flag(I))]).

depends_on(f(chroma_weight_l1_flag(I)), [f(slice_type), f(num_ref_idx_l1_active_minus1), f(luma_weight_l1_flag(I)), f(dChromaArrayType)]).

depends_on(f(pcm_alignment_zero_bit), [f(mb_type)]).

depends_on(f(pcm_sample_luma(_I)), [f(mb_type), f(dBitDepthY)]).

depends_on(f(pcm_sample_chroma(_I)), [f(mb_type), f(dMbWidthC), f(dMbHeightC), f(dBitDepthC)]).

depends_on(f(transform_size_8x8_flag), [
    f(mb_type),
    f(dMbPartPredMode),
    f(dCodedBlockPatternLuma),
    f(transform_8x8_mode_flag),
    f(dNoSubMbPartSizeLessThan8x8Flag),
    f(direct_8x8_inference_flag)
]).

depends_on(f(coded_block_pattern), [f(mb_type), f(dMbPartPredMode)]).

depends_on(f(dMbPartPredMode), [f(mb_type)]).

depends_on(f(dMbWidthC), [f(chroma_format_idc), f(separate_colour_plane_flag), f(dSubWidthC)]).

depends_on(f(dMbHeightC), [f(chroma_format_idc), f(separate_colour_plane_flag), f(dSubHeightC)]).

depends_on(f(dCodedBlockPatternLuma), [f(coded_block_pattern)]).

depends_on(f(dCodedBlockPatternChroma), [f(coded_block_pattern)]).

depends_on(f(mb_qp_delta), [f(mb_type), f(coded_block_pattern_luma), f(coded_block_pattern_chroma)]).

depends_on(f(svc_vui_parameters_present_flag), [f(profile_idc)]).

depends_on(f(bit_equal_to_one), [f(profile_idc)]).

depends_on(f(mvc_vui_parameters_present_flag), [f(profile_idc)]).

depends_on(f(additional_extension2_flag), []).

depends_on(f(additional_extension2_data_flag), [f(additional_extension2_flag)]).

depends_on(f(delta_scale(_J)), [f(size_of_scaling_list), f(next_scale)]).

depends_on(f(primary_pic_type), []).

depends_on(f(seq_parameter_set_id), []).

depends_on(f(aux_format_idc), []).

depends_on(f(bit_depth_aux_minus8), [f(aux_format_idc)]).

depends_on(f(alpha_incr_flag), [f(aux_format_idc)]).

depends_on(f(alpha_opaque_value), [f(aux_format_idc), f(bit_depth_aux_minus8)]).

depends_on(f(alpha_transparent_value), [f(aux_format_idc), f(bit_depth_aux_minus8), f(alpha_incr_flag), f(alpha_opaque_value)]).

depends_on(f(additional_extension_flag), []).

depends_on(f(slice_id), [f(separate_colour_plane_flag), f(mbaff_frame_flag), f(pic_size_in_mbs), f(colour_plane_id)]).

depends_on(f(colour_plane_id), [f(separate_colour_plane_flag)]).

depends_on(f(redundant_pic_cnt), [f(redundant_pic_cnt_present_flag)]).

depends_on(f(ref_pic_list_modification_flag_l0), [f(slice_type)]).

depends_on(f(modification_of_pic_nums_idc(_I)), [f(slice_type), f(ref_pic_list_modification_flag_l1)]).

depends_on(f(abs_diff_pic_num_minus1), [f(slice_type), f(ref_pic_list_modification_flag_l1), f(modification_of_pic_nums_idc), f(dMaxPicNum)]).

depends_on(f(long_term_pic_num), [f(dIdrPicFlag), f(adaptive_ref_pic_marking_mode_flag), f(memory_management_control_operation)]).

depends_on(f(ref_pic_list_modification_flag_l1), [f(slice_type)]).

depends_on(f(prev_intra4x4_pred_mode_flag(_)), [f(mb_type)]).

depends_on(f(rem_intra4x4_pred_mode(Luma4x4BlkIdx)), [f(mb_type), f(prev_intra4x4_pred_mode_flag(Luma4x4BlkIdx))]).

depends_on(f(prev_intra8x8_pred_mode_flag(_)), [f(mb_type)]).

depends_on(f(rem_intra8x8_pred_mode(Luma8x8BlkIdx)), [f(mb_type), f(prev_intra8x8_pred_mode_flag(Luma8x8BlkIdx))]).

depends_on(f(intra_chroma_pred_mode), [f(mb_type), f(dChromaArrayType)]).

depends_on(f(ref_idx_l0(MbPartIdx)), [f(num_ref_idx_l0_active_minus1), f(mb_field_decoding_flag), f(field_pic_flag), f(mb_type), f(sub_mb_type(MbPartIdx))]).

depends_on(f(ref_idx_l1(MbPartIdx)), [f(num_ref_idx_l1_active_minus1), f(mb_field_decoding_flag), f(field_pic_flag), f(sub_mb_type(MbPartIdx))]).

depends_on(f(cabac_zero_word), [f(entropy_coding_mode_flag)]).

depends_on(f(no_output_of_prior_pics_flag), [f(dIdrPicFlag)]).

depends_on(f(long_term_reference_flag), [f(dIdrPicFlag)]).

depends_on(f(adaptive_ref_pic_marking_mode_flag), [f(dIdrPicFlag)]).

depends_on(f(memory_management_control_operation), [f(dIdrPicFlag), f(adaptive_ref_pic_marking_mode_flag)]).

depends_on(f(difference_of_pic_nums_minus1), [f(dIdrPicFlag), f(adaptive_ref_pic_marking_mode_flag), f(memory_management_control_operation)]).

depends_on(f(long_term_frame_idx), [f(dIdrPicFlag), f(adaptive_ref_pic_marking_mode_flag), f(memory_management_control_operation), f(dMaxLongTermFrameIdx)]).

depends_on(f(max_long_term_frame_idx_plus1), [f(dIdrPicFlag), f(adaptive_ref_pic_marking_mode_flag), f(memory_management_control_operation), f(dMaxNumRefFrames)]).

depends_on(f(cabac_alignment_one_bit), [f(entropy_coding_mode_flag), f(dByteAligned)]).

depends_on(f(mb_skip_run), [f(more_data_flag), f(slice_type), f(entropy_coding_mode_flag)]). % 'I' and 'SI' are values, not fields.

depends_on(f(mb_skip_flag), [f(more_data_flag), f(slice_type), f(entropy_coding_mode_flag)]). % 'I' and 'SI' are values, not fields.

depends_on(f(mb_field_decoding_flag), [f(more_data_flag), f(mbaff_frame_flag), f(curr_mb_addr), f(prev_mb_skipped)]).

depends_on(f(end_of_slice_flag), [f(more_data_flag), f(entropy_coding_mode_flag), f(mbaff_frame_flag), f(curr_mb_addr)]).

depends_on(f(last_payload_type_byte), []).

depends_on(f(last_payload_size_byte), []).

depends_on(f(pic_parameter_set_id), []).

depends_on(f(entropy_coding_mode_flag), []).

depends_on(f(bottom_field_pic_order_in_frame_present_flag), []).

depends_on(f(num_slice_groups_minus1), []).

depends_on(f(slice_group_map_type), [f(num_slice_groups_minus1)]).

depends_on(f(run_length_minus1(_IGroup)), [f(num_slice_groups_minus1), f(slice_group_map_type)]).

depends_on(f(top_left(_IGroup)), [f(num_slice_groups_minus1), f(slice_group_map_type)]).

depends_on(f(bottom_right(_IGroup)), [f(num_slice_groups_minus1), f(slice_group_map_type)]).

depends_on(f(slice_group_change_direction_flag), [f(num_slice_groups_minus1), f(slice_group_map_type)]).

depends_on(f(slice_group_change_rate_minus1), [f(num_slice_groups_minus1), f(slice_group_map_type)]).

depends_on(f(pic_size_in_map_units_minus1), [f(num_slice_groups_minus1), f(slice_group_map_type)]).

depends_on(f(slice_group_id(_I)), [f(num_slice_groups_minus1), f(slice_group_map_type), f(pic_size_in_map_units_minus1)]).

depends_on(f(dPicScalingListCount), [f(chroma_format_idc), f(transform_8x8_mode_flag)]).

depends_on(f(transform_8x8_mode_flag), [f(more_rbsp_data)]).

depends_on(f(pic_scaling_matrix_present_flag), [f(more_rbsp_data)]).

depends_on(f(pic_scaling_list_present_flag(_I)), [f(more_rbsp_data), f(pic_scaling_matrix_present_flag), f(dPicScalingListCount)]).

depends_on(f(second_chroma_qp_index_offset), [f(more_rbsp_data)]).

depends_on(f(constraint_set0_flag), [f(profile_idc)]).

depends_on(f(constraint_set1_flag), [f(profile_idc)]).

depends_on(f(constraint_set2_flag), [f(profile_idc)]).

depends_on(f(constraint_set3_flag), [f(profile_idc)]).

depends_on(f(constraint_set4_flag), [f(profile_idc)]).

depends_on(f(chroma_format_idc), [f(profile_idc)]).

depends_on(f(separate_colour_plane_flag), [f(profile_idc), f(chroma_format_idc)]).

depends_on(f(bit_depth_luma_minus8), [f(profile_idc)]).

depends_on(f(bit_depth_chroma_minus8), [f(profile_idc)]).

depends_on(f(qpprime_y_zero_transform_bypass_flag), [f(profile_idc)]).

depends_on(f(seq_scaling_matrix_present_flag), [f(profile_idc)]).

depends_on(f(seq_scaling_list_present_flag(_)), [f(profile_idc), f(seq_scaling_matrix_present_flag), f(chroma_format_idc)]).

depends_on(f(log2_max_pic_order_cnt_lsb_minus4), [f(pic_order_cnt_type)]).

depends_on(f(delta_pic_order_always_zero_flag), [f(pic_order_cnt_type)]).

depends_on(f(offset_for_non_ref_pic), [f(pic_order_cnt_type)]).

depends_on(f(offset_for_top_to_bottom_field), [f(pic_order_cnt_type)]).

depends_on(f(num_ref_frames_in_pic_order_cnt_cycle), [f(pic_order_cnt_type)]).

depends_on(f(offset_for_ref_frame(_)), [f(pic_order_cnt_type), f(num_ref_frames_in_pic_order_cnt_cycle)]).

depends_on(f(mb_adaptive_frame_field_flag), [f(frame_mbs_only_flag)]).

depends_on(f(direct_8x8_inference_flag), [f(frame_mbs_only_flag)]).

depends_on(f(frame_crop_left_offset), [f(frame_cropping_flag)]).

depends_on(f(frame_crop_right_offset), [f(frame_cropping_flag)]).

depends_on(f(frame_crop_top_offset), [f(frame_cropping_flag)]).

depends_on(f(frame_crop_bottom_offset), [f(frame_cropping_flag)]).

depends_on(f(trailing_ones_sign_flag(_I)), [
    f(residual_block_cavlc, coeff_token),
    f(residual_block_cavlc, dTotalCoeff),
    f(residual_block_cavlc, dTrailingOnes)
]).

depends_on(f(level_prefix(_I)), [
    f(residual_block_cavlc, coeff_token),
    f(residual_block_cavlc, dTotalCoeff),
    f(residual_block_cavlc, dTrailingOnes)
]).

depends_on(f(level_suffix(I)), [
    f(residual_block_cavlc, coeff_token),
    f(residual_block_cavlc, dTotalCoeff),
    f(residual_block_cavlc, dTrailingOnes),
    f(residual_block_cavlc, level_prefix(I)),
    f(residual_block_cavlc, dSuffixLength)
]).

depends_on(f(total_zeros), [
    f(residual_block_cavlc, coeff_token),
    f(residual_block_cavlc, dTotalCoeff),
    f(residual_block_cavlc, dEndIdx),
    f(residual_block_cavlc, dStartIdx)
]).

depends_on(f(run_before(_I)), [
    f(residual_block_cavlc, coeff_token),
    f(residual_block_cavlc, dTotalCoeff),
    f(residual_block_cavlc, dZerosLeft)
]).

depends_on(f(coded_block_flag), [f(residual_block_cabac, dMaxNumCoeff), f(dChromaArrayType)]).

depends_on(f(significant_coeff_flag(_I)), [
    f(residual_block_cabac, dMaxNumCoeff),
    f(dChromaArrayType),
    f(residual_block_cabac, coded_block_flag),
    f(residual_block_cabac, dNumCoeff)
]).

depends_on(f(last_significant_coeff_flag(I)), [
    f(residual_block_cabac, dMaxNumCoeff),
    f(dChromaArrayType),
    f(residual_block_cabac, coded_block_flag),
    f(residual_block_cabac, dNumCoeff),
    f(residual_block_cabac, significant_coeff_flag(I))
]).

depends_on(f(delta_pic_order_cnt(1)), [f(pic_order_cnt_type), f(delta_pic_order_always_zero_flag), f(bottom_field_pic_order_in_frame_present_flag), f(field_pic_flag)]).

depends_on(f(direct_spatial_mv_pred_flag), [f(slice_type)]).

depends_on(f(num_ref_idx_active_override_flag), [f(slice_type)]).

depends_on(f(num_ref_idx_l0_active_minus1), [f(slice_type), f(num_ref_idx_active_override_flag)]).

depends_on(f(num_ref_idx_l1_active_minus1), [f(slice_type), f(num_ref_idx_active_override_flag)]).

depends_on(f(cabac_init_idc), [f(entropy_coding_mode_flag), f(slice_type)]).

depends_on(f(slice_qp_delta), []).

depends_on(f(sp_for_switch_flag), [f(slice_type)]).

depends_on(f(slice_qs_delta), [f(slice_type)]).

depends_on(f(disable_deblocking_filter_idc), [f(deblocking_filter_control_present_flag)]).

depends_on(f(slice_alpha_c0_offset_div2), [f(deblocking_filter_control_present_flag), f(disable_deblocking_filter_idc)]).

depends_on(f(slice_beta_offset_div2), [f(deblocking_filter_control_present_flag), f(disable_deblocking_filter_idc)]).

depends_on(f(slice_group_change_cycle), [f(num_slice_groups_minus1), f(slice_group_map_type)]).

depends_on(f(rbsp_stop_one_bit), []).

depends_on(f(rbsp_alignment_zero_bit), []).

depends_on(f(sub_mb_type(_)), []).

depends_on(f(dSubMbPred), [f(mb_type), f(dMbPartPredMode), f(dNumMbPart)]).

depends_on(f(dMbPred), [f(mb_type), f(dMbPartPredMode), f(dNumMbPart)]).

depends_on(f(dPicScalingListCount), [f(chroma_format_idc), f(transform_8x8_mode_flag)]).

depends_on(f(dSeqScalingListCount), [f(chroma_format_idc)]).

depends_on(f(dLevelVal(_), residual_block_cavlc), [f(dTotalCoeff), f(coeff_token), f(dTrailingOnes)]).

depends_on(f(dRunVal(_), residual_block_cavlc), [f(dTotalCoeff), f(coeff_token), f(dZerosLeft, residual_block_cavlc)]).

depends_on(f(dCoeffLevel(_), residual_block_cabac), [f(maxNumCoeff), f(dChromaArrayType), f(coded_block_flag), f(dNumCoeff, residual_block_cabac), f(startIdx), f(significant_coeff_flag(_))]).

depends_on(f(rbsp_trailing_bits), []).

depends_on(f(dIdrPicFlag), [f(nal_unit_type)]).

depends_on(f(dDepthFlag), [f(nal_unit_type), f(avc_3d_extension_flag), f(depth_flag)]).

depends_on(f(dChromaArrayType), [f(separate_colour_plane_flag), f(chroma_format_idc)]).

depends_on(f(dBitDepthY), [f(bit_depth_luma_minus8)]).

depends_on(f(dQpBdOffsetY), [f(bit_depth_luma_minus8)]).

depends_on(f(dBitDepthC), [f(bit_depth_chroma_minus8)]).

depends_on(f(dQpBdOffsetC), [f(bit_depth_chroma_minus8)]).

depends_on(f(dRawMbBits), [f(dBitDepthY), f(dMbWidthC), f(dMbHeightC), f(dBitDepthC)]).

depends_on(f(dFlat_4x4_16(_)), []).

depends_on(f(dFlat_8x8_16(_)), []).

depends_on(f(dMaxFrameNum), [f(log2_max_frame_num_minus4)]).

depends_on(f(dMaxPicOrderCntLsb), [f(log2_max_pic_order_cnt_lsb_minus4)]).

depends_on(f(dExpectedDeltaPerPicOrderCntCycle), [f(num_ref_frames_in_pic_order_cnt_cycle), f(offset_for_ref_frame(_))]).

depends_on(f(dPicWidthInMbs), [f(pic_width_in_mbs_minus1)]).

depends_on(f(dPicWidthInSamplesL), [f(dPicWidthInMbs)]).

depends_on(f(dPicWidthInSamplesC), [f(dPicWidthInMbs), f(dMbWidthC)]).

depends_on(f(dPicHeightInMapUnits), [f(pic_height_in_map_units_minus1)]).

depends_on(f(dPicSizeInMapUnits), [f(dPicWidthInMbs), f(dPicHeightInMapUnits)]).

depends_on(f(dFrameHeightInMbs), [f(frame_mbs_only_flag), f(dPicHeightInMapUnits)]).

depends_on(f(dCropUnitX), [f(dChromaArrayType), f(dSubWidthC)]).

depends_on(f(dCropUnitY), [f(dChromaArrayType), f(frame_mbs_only_flag), f(dSubHeightC)]).

depends_on(f(dCroppedWidthL), [f(dPicWidthInSamplesL), f(dCropUnitX), f(frame_crop_left_offset), f(frame_crop_right_offset)]).

depends_on(f(dCroppedWidthC), [f(dPicWidthInSamplesC), f(dCropUnitX), f(frame_crop_left_offset), f(frame_crop_right_offset)]).

depends_on(f(dCroppedHeight), [f(dFrameHeightInMbs), f(dCropUnitY), f(frame_crop_top_offset), f(frame_crop_bottom_offset)]).

depends_on(f(dSliceGroupChangeRate), [f(slice_group_change_rate_minus1)]).

depends_on(f(dMbaffFrameFlag), [f(mb_adaptive_frame_field_flag), f(field_pic_flag)]).

depends_on(f(dPicHeightInMbs), [f(dFrameHeightInMbs), f(field_pic_flag)]).

depends_on(f(dPicHeightInSamplesL), [f(dPicHeightInMbs)]).

depends_on(f(dPicHeightInSamplesC), [f(dPicHeightInMbs), f(dMbHeightC)]).

depends_on(f(dPicSizeInMbs), [f(dPicWidthInMbs), f(dPicHeightInMbs)]).

depends_on(f(dMaxPicNum), [f(field_pic_flag), f(dMaxFrameNum)]).

depends_on(f(dCurrPicNum), [f(field_pic_flag), f(frame_num)]).

depends_on(f(dSliceQPY), [f(pic_init_qp_minus26), f(slice_qp_delta)]).

depends_on(f(dQSY), [f(pic_init_qs_minus26), f(slice_qs_delta)]).

depends_on(f(dFilterOffsetA), [f(slice_alpha_c0_offset_div2)]).

depends_on(f(dFilterOffsetB), [f(slice_beta_offset_div2)]).

depends_on(f(dMapUnitsInSliceGroup0), [f(slice_group_change_cycle), f(dSliceGroupChangeRate), f(dPicSizeInMapUnits)]).

depends_on(f(dCodedBlockPatternLuma), [f(coded_block_pattern)]).

depends_on(f(dCodedBlockPatternChroma), [f(coded_block_pattern)]).

depends_on(f(dSubWidthC), [f(chroma_format_idc), f(separate_colour_plane_flag)]).

depends_on(f(dSubHeightC), [f(chroma_format_idc), f(separate_colour_plane_flag)]).

depends_on(f(dQpy), [f(dQpyPrev), f(mb_qp_delta), f(dQpBdOffsetY)]).

depends_on(f(dQpPrimeY), [f(dQpy), f(dQpBdOffsetY)]).

depends_on(f(dTransformBypassModeFlag), [f(qpprime_y_zero_transform_bypass_flag), f(dQpPrimeY)]).

depends_on(f(chroma_weight_l0(_I, _J)), [
    f(num_ref_idx_l0_active_minus1),
    f(luma_weight_l0_flag),
    f(dChromaArrayType),
    f(chroma_weight_l0_flag),
    f(chroma_log2_weight_denom)
]).

depends_on(f(chroma_offset_l0(_I, _J)), [
    f(num_ref_idx_l0_active_minus1),
    f(luma_weight_l0_flag),
    f(dChromaArrayType),
    f(chroma_weight_l0_flag)
]).

depends_on(f(chroma_weight_l1(I, _J)), [
    f(slice_type),
    f(num_ref_idx_l1_active_minus1),
    f(luma_weight_l1_flag(I)),
    f(dChromaArrayType),
    f(chroma_weight_l1_flag(I))
]).

depends_on(f(chroma_offset_l1(I, _J)), [
    f(slice_type),
    f(num_ref_idx_l1_active_minus1),
    f(luma_weight_l1_flag(I)),
    f(dChromaArrayType),
    f(chroma_weight_l1_flag(I))
]).

depends_on(f(mvd_l0(_MbPartIdx, _CompIdx)), [f(mb_type), f(dNumMbPart(mb_type))]).

depends_on(f(mvd_l1(_MbPartIdx, _CompIdx)), [f(mb_type), f(dNumMbPart(mb_type))]).

depends_on(f(residual_block_cavlc, dTotalCoeff), [f(residual_block_cavlc, coeff_token)]).

depends_on(f(residual_block_cavlc, dTrailingOnes), [f(residual_block_cavlc, coeff_token)]).

depends_on(f(residual_block_cavlc, dSuffixLength), [f(residual_block_cavlc, coeff_token)]).

depends_on(f(residual_block_cavlc, dZerosLeft), [f(residual_block_cavlc, total_zeros)]).

depends_on(f(subset_seq_parameter_set_rbsp, seq_parameter_set_data), []).

depends_on(f(subset_seq_parameter_set_rbsp, seq_parameter_set_svc_extension), [f(profile_idc)]).

depends_on(f(subset_seq_parameter_set_rbsp, svc_vui_parameters_extension), [f(profile_idc), f(svc_vui_parameters_present_flag)]).

depends_on(f(subset_seq_parameter_set_rbsp, seq_parameter_set_mvc_extension), [f(profile_idc)]).

depends_on(f(subset_seq_parameter_set_rbsp, mvc_vui_parameters_extension), [f(profile_idc), f(mvc_vui_parameters_present_flag)]).

depends_on(f(subset_seq_parameter_set_rbsp, seq_parameter_set_mvcd_extension), [f(profile_idc)]).

depends_on(f(subset_seq_parameter_set_rbsp, seq_parameter_set_3davc_extension), [f(profile_idc)]).

depends_on(f(subset_seq_parameter_set_rbsp, rbsp_trailing_bits), []).

depends_on(f(access_unit_delimiter_rbsp, rbsp_trailing_bits), []).

depends_on(f(seq_parameter_set_extension_rbsp, rbsp_trailing_bits), []).

depends_on(f(slice_data_partition_c_layer_rbsp, slice_data), []).

depends_on(f(slice_data_partition_c_layer_rbsp, rbsp_slice_trailing_bits), []).

depends_on(f(rbsp_slice_trailing_bits, rbsp_trailing_bits), []).

depends_on(f(residual(_StartIdx, _EndIdx), dResidualBlock), [f(entropy_coding_mode_flag)]).

depends_on(f(residual(_StartIdx, _EndIdx), residual_luma), []).

depends_on(f(residual(_StartIdx, _EndIdx), dIntra16x16DCLevel), []).

depends_on(f(residual(_StartIdx, _EndIdx), dIntra16x16ACLevel), []).

depends_on(f(residual(_StartIdx, _EndIdx), dLumaLevel4x4), []).

depends_on(f(residual, dLumaLevel8x8), []).

depends_on(f(residual, dNumC8x8), [f(dChromaArrayType)]).

depends_on(f(residual, residual_block(_ICbCr)), [f(dChromaArrayType), f(dCodedBlockPatternChroma), f(startIdx)]).

depends_on(f(residual, residual_luma), [f(dChromaArrayType)]).

depends_on(f(residual, dCbIntra16x16DCLevel), [f(dChromaArrayType)]).

depends_on(f(residual, dCbIntra16x16ACLevel), [f(dChromaArrayType)]).

depends_on(f(residual, dCbLevel4x4), [f(dChromaArrayType)]).

depends_on(f(residual, dCbLevel8x8), [f(dChromaArrayType)]).

depends_on(f(residual, dCrIntra16x16DCLevel), [f(dChromaArrayType)]).

depends_on(f(residual, dCrIntra16x16ACLevel), [f(dChromaArrayType)]).

depends_on(f(residual, dCrLevel4x4), [f(dChromaArrayType)]).

depends_on(f(residual, dCrLevel8x8), [f(dChromaArrayType)]).

depends_on(f(filler_data_rbsp, rbsp_trailing_bits), []).

depends_on(f(prefix_nal_unit_rbsp, prefix_nal_unit_svc), [f(svc_extension_flag)]).

depends_on(f(seq_parameter_set_rbsp, seq_parameter_set_data), []).

depends_on(f(seq_parameter_set_rbsp, rbsp_trailing_bits), []).

depends_on(f(slice_data, dCurrMbAddr), []).

depends_on(f(slice_data, dMoreDataFlag), []).

depends_on(f(slice_data, dPrevMbSkipped), []).

depends_on(f(slice_data, dPrevMbSkipped), [f(dMoreDataFlag), f(slice_type), f(entropy_coding_mode_flag)]).

depends_on(f(slice_data, dCurrMbAddr), [f(dMoreDataFlag), f(slice_type), f(entropy_coding_mode_flag), f(mb_skip_run)]).

depends_on(f(slice_data, dMoreDataFlag), [f(dMoreDataFlag), f(slice_type), f(entropy_coding_mode_flag), f(mb_skip_run)]).

depends_on(f(slice_data, dMoreDataFlag), [f(dMoreDataFlag), f(slice_type), f(entropy_coding_mode_flag)]).

depends_on(f(slice_data, macroblock_layer), [f(dMoreDataFlag)]).

depends_on(f(slice_data, dMoreDataFlag), [f(dMoreDataFlag), f(entropy_coding_mode_flag)]).

depends_on(f(slice_data, dPrevMbSkipped), [f(dMoreDataFlag), f(entropy_coding_mode_flag), f(slice_type)]).

depends_on(f(slice_data, dMoreDataFlag), [f(dMoreDataFlag), f(entropy_coding_mode_flag), f(mbaff_frame_flag), f(dCurrMbAddr)]).

depends_on(f(slice_data, dMoreDataFlag), [f(dMoreDataFlag), f(entropy_coding_mode_flag), f(mbaff_frame_flag), f(dCurrMbAddr)]).

depends_on(f(slice_data, dCurrMbAddr), [f(dMoreDataFlag)]).

depends_on(f(sei_message, sei_payload), []).

depends_on(f(residual_luma, residual_block), [f(mb_type)]).

depends_on(f(residual_luma, residual_block), [f(transform_size_8x8_flag), f(entropy_coding_mode_flag), f(dCodedBlockPatternLuma), f(mb_type)]).

depends_on(f(residual_luma, residual_block), [f(transform_size_8x8_flag), f(entropy_coding_mode_flag), f(dCodedBlockPatternLuma), f(mb_type)]).

depends_on(f(residual_luma, residual_block(_I8x8)), [f(transform_size_8x8_flag), f(entropy_coding_mode_flag), f(coded_block_pattern)]).

depends_on(f(pic_parameter_set_rbsp, scaling_list(I)), [f(pic_scaling_matrix_present_flag), f(pic_scaling_list_present_flag(I)), f(dPicScalingListCount)]).

depends_on(f(pic_parameter_set_rbsp, rbsp_trailing_bits), []).

depends_on(f(seq_parameter_set_data, scaling_list(I)), [f(profile_idc), f(seq_scaling_matrix_present_flag), f(seq_scaling_list_present_flag(I)), f(dSeqScalingListCount)]).

depends_on(f(seq_parameter_set_data, vui_parameters), [f(vui_parameters_present_flag)]).

depends_on(f(slice_data_partition_b_layer_rbsp, slice_data), []).

depends_on(f(slice_data_partition_b_layer_rbsp, rbsp_slice_trailing_bits), []).

depends_on(f(slice_layer_without_partitioning_rbsp, slice_header), []).

depends_on(f(slice_layer_without_partitioning_rbsp, slice_data), []).

depends_on(f(slice_layer_without_partitioning_rbsp, rbsp_slice_trailing_bits), []).

depends_on(f(residual_block_cavlc, dSuffixLength), [f(dTotalCoeff)]).

depends_on(f(residual_block_cavlc, dLevelVal(I)), [f(dTotalCoeff), f(dTrailingOnes), f(level_suffix(I))]).

depends_on(f(residual_block_cavlc, dLevelCode(_I)), [f(dTotalCoeff), f(dTrailingOnes), f(level_prefix), f(residual_block_cavlc, dSuffixLength)]).

depends_on(f(dSuffixLength, residual_block_cavlc), [f(dTotalCoeff), f(coeff_token), f(dTrailingOnes), f(dLevelVal(_), residual_block_cavlc)]).

depends_on(f(dZerosLeft, residual_block_cavlc), [f(dTotalCoeff), f(coeff_token), f(endIdx), f(startIdx)]).

depends_on(f(dRunValLast, residual_block_cavlc), [f(dTotalCoeff), f(coeff_token)]).

depends_on(f(dCoeffNum, residual_block_cavlc), [f(dTotalCoeff), f(coeff_token)]).

depends_on(f(dCoeffLevelIndexed, residual_block_cavlc), [f(dTotalCoeff), f(coeff_token), f(startIdx), f(dCoeffNum, residual_block_cavlc)]).

depends_on(f(dNumCoeff, residual_block_cabac), [f(maxNumCoeff), f(dChromaArrayType), f(coded_block_flag), f(dI, residual_block_cabac), f(significant_coeff_flag(_)), f(last_significant_coeff_flag(_))]).

depends_on(f(dI, residual_block_cabac), [f(maxNumCoeff), f(dChromaArrayType), f(coded_block_flag)]).

depends_on(f(dCoeffLevelLast, residual_block_cabac), [f(maxNumCoeff), f(dChromaArrayType), f(coded_block_flag), f(dNumCoeff, residual_block_cabac)]).

depends_on(f(slice_header_in_scalable_extension, slice_layer_extension_rbsp), [f(svc_extension_flag)]).

depends_on(f(slice_data_in_scalable_extension, slice_layer_extension_rbsp), [f(svc_extension_flag), f(slice_skip_flag)]).

depends_on(f(slice_header_in_3davc_extension, slice_layer_extension_rbsp), [f(svc_extension_flag), f(avc_3d_extension_flag)]).

depends_on(f(slice_data_in_3davc_extension, slice_layer_extension_rbsp), [f(svc_extension_flag), f(avc_3d_extension_flag)]).

depends_on(f(slice_layer_extension_rbsp, slice_header), [f(svc_extension_flag), f(avc_3d_extension_flag)]).

depends_on(f(slice_layer_extension_rbsp, slice_data), [f(svc_extension_flag), f(avc_3d_extension_flag)]).

depends_on(f(slice_layer_extension_rbsp, rbsp_slice_trailing_bits), []).

depends_on(f(slice_data_partition_a_layer_rbsp, slice_header), []).

depends_on(f(slice_data_partition_a_layer_rbsp, slice_data), []).

depends_on(f(slice_data_partition_a_layer_rbsp, rbsp_slice_trailing_bits), []).

depends_on(f(nal_unit, dNumBytesInRBSP), []).

depends_on(f(nal_unit, dNalUnitHeaderBytes), [f(nal_unit_type)]).

depends_on(f(nal_unit, nal_unit_header_svc_extension), [f(nal_unit_type), f(svc_extension_flag)]).

depends_on(f(nal_unit, nal_unit_header_3davc_extension), [f(nal_unit_type), f(svc_extension_flag), f(avc_3d_extension_flag)]).

depends_on(f(nal_unit, nal_unit_header_mvc_extension), [f(nal_unit_type), f(svc_extension_flag), f(avc_3d_extension_flag)]).

depends_on(f(slice_header, ref_pic_list_mvc_modification), [f(nal_unit_type)]).

depends_on(f(slice_header, ref_pic_list_modification), [f(nal_unit_type)]).

depends_on(f(slice_header, pred_weight_table), [f(weighted_pred_flag), f(slice_type), f(weighted_bipred_idc)]).

depends_on(f(slice_header, dec_ref_pic_marking), [f(nal_ref_idc)]).

depends_on(f(sei_rbsp, sei_message), [f(dMoreRbspData)]).

depends_on(f(mvd_l0(MbPartIdx, _, _)), [f(sub_mb_type(MbPartIdx)), f(dNumSubMbPart(MbPartIdx))]).

depends_on(f(mvd_l1(MbPartIdx, _, _)), [f(sub_mb_type(MbPartIdx)), f(dNumSubMbPart(MbPartIdx))]).

depends_on(f(macroblock_layer, residual(0, 15)), [f(mb_type), f(dCodedBlockPatternLuma), f(dCodedBlockPatternChroma), f(dMbPartPredMode(mb_type, 0))]).

depends_on(f(residual, dChromaDCLevel(_ICbCr, _I)), [f(dChromaArrayType), f(dCodedBlockPatternChroma), f(startIdx), f(residual, dNumC8x8)]).

depends_on(f(residual_luma, dI16x16acLevel(_,_)), [f(transform_size_8x8_flag), f(entropy_coding_mode_flag), f(dCodedBlockPatternLuma), f(mb_type)]).

depends_on(f(residual_luma, dLevel4x4(_,_)), [f(transform_size_8x8_flag), f(entropy_coding_mode_flag), f(dCodedBlockPatternLuma), f(mb_type)]).

depends_on(f(residual_luma, dLevel8x8(_,_)), [f(transform_size_8x8_flag), f(entropy_coding_mode_flag)]).

depends_on(f(residual_luma, dLevel8x8(_I8x8, _I)), [f(transform_size_8x8_flag), f(entropy_coding_mode_flag), f(coded_block_pattern)]).

depends_on(f(residual, residual_block(_ICbCr, _I8x8, _I4x4)), [f(dChromaArrayType), f(residual, dNumC8x8), f(dCodedBlockPatternChroma)]).

depends_on(f(residual, dChromaACLevel(_ICbCr, _I8x8, _I4x4, _I)), [f(dChromaArrayType), f(residual, dNumC8x8), f(dCodedBlockPatternChroma)]).

% f/1
f(luma_weight_l0(I)) :-
  domain(f(num_ref_idx_l0_active_minus1), N), I #&gt;= 0, I #=&lt; N.

f(luma_offset_l0(I)) :-
  domain(f(num_ref_idx_l0_active_minus1), N), I #&gt;= 0, I #=&lt; N.

f(chroma_weight_l0_flag) :-
  domain(f(num_ref_idx_l0_active_minus1), N), I #&gt;= 0, I #=&lt; N.

f(luma_weight_l1_flag(I)) :-
  domain(f(num_ref_idx_l1_active_minus1), N), I #&gt;= 0, I #=&lt; N.

f(luma_weight_l1(I)) :-
  domain(f(num_ref_idx_l1_active_minus1), N), I #&gt;= 0, I #=&lt; N.

f(luma_offset_l1(I)) :-
  domain(f(num_ref_idx_l1_active_minus1), N), I #&gt;= 0, I #=&lt; N.

f(chroma_weight_l1_flag(I)) :-
  domain(f(num_ref_idx_l1_active_minus1), N), I #&gt;= 0, I #=&lt; N.

f(mb_type).

f(luma_log2_weight_denom).

f(chroma_log2_weight_denom).

f(luma_weight_l0_flag).


f(pcm_alignment_zero_bit).

f(pcm_sample_luma(I)) :-
  I #&gt;= 0, I #&lt; 256.

f(pcm_sample_chroma(I)) :-
    domain(f(dMbWidthC), MbWC),
    domain(f(dMbHeightC), MbHC),
    N #= 2 * MbWC * MbHC,
    I #&gt;= 0, I #&lt; N.

f(transform_size_8x8_flag).

f(dChromaArrayType).

f(num_ref_idx_l0_active_minus1).

f(num_ref_idx_l1_active_minus1).

f(slice_type).

f(dBitDepthY).

f(dMbWidthC).

f(dMbHeightC).

f(dBitDepthC).

f(dMbPartPredMode).

f(transform_8x8_mode_flag).

f(dNoSubMbPartSizeLessThan8x8Flag).

f(direct_8x8_inference_flag).

f(dCodedBlockPatternChroma).

f(mb_qp_delta).

f(svc_vui_parameters_present_flag).

f(bit_equal_to_one).

f(mvc_vui_parameters_present_flag).

f(additional_extension2_flag).

f(additional_extension2_data_flag).

f(delta_scale(J)) :-
  domain(f(size_of_scaling_list), N), J #&gt;= 0, J #&lt; N.

f(primary_pic_type).

f(seq_parameter_set_id).

f(aux_format_idc).

f(bit_depth_aux_minus8).

f(alpha_incr_flag).

f(alpha_opaque_value).

f(alpha_transparent_value).

f(additional_extension_flag).

f(slice_id).

f(colour_plane_id).

f(redundant_pic_cnt).

f(ref_pic_list_modification_flag_l0).

f(dCodedBlockPatternLuma).

f(modification_of_pic_nums_idc(I)) :-
  I #&gt;= 0.

f(abs_diff_pic_num_minus1).

f(long_term_pic_num).

f(ref_pic_list_modification_flag_l1).

f(prev_intra4x4_pred_mode_flag(Luma4x4BlkIdx)) :-
  Luma4x4BlkIdx #&gt;= 0, Luma4x4BlkIdx #&lt; 16.

f(rem_intra4x4_pred_mode(Luma4x4BlkIdx)) :-
  Luma4x4BlkIdx #&gt;= 0, Luma4x4BlkIdx #&lt; 16.

f(prev_intra8x8_pred_mode_flag(Luma8x8BlkIdx)) :-
  Luma8x8BlkIdx #&gt;= 0, Luma8x8BlkIdx #&lt; 4.

f(rem_intra8x8_pred_mode(Luma8x8BlkIdx)) :-
  Luma8x8BlkIdx #&gt;= 0, Luma8x8BlkIdx #&lt; 4.

f(intra_chroma_pred_mode).

f(ref_idx_l0(MbPartIdx)) :-
  MbPartIdx #&gt;= 0, MbPartIdx #&lt; 4.

f(ref_idx_l1(MbPartIdx)) :-
  MbPartIdx #&gt;= 0, MbPartIdx #&lt; 4.

f(cabac_zero_word).

f(no_output_of_prior_pics_flag).

f(long_term_reference_flag).

f(adaptive_ref_pic_marking_mode_flag).

f(memory_management_control_operation).

f(difference_of_pic_nums_minus1).

f(long_term_frame_idx).

f(max_long_term_frame_idx_plus1).

f(dMaxPicNum).

f(dChromaArrayType).

f(dNumMbPart(_MbType)).

f(dMaxLongTermFrameIdx).

f(dMaxNumRefFrames).

f(ff_byte).

f(cabac_alignment_one_bit).

f(mb_skip_run).

f(mb_skip_flag).

f(mb_field_decoding_flag).

f(end_of_slice_flag).

f(last_payload_type_byte).

f(last_payload_size_byte).

f(pic_parameter_set_id).

f(entropy_coding_mode_flag).

f(bottom_field_pic_order_in_frame_present_flag).

f(num_slice_groups_minus1).

f(slice_group_map_type).

f(run_length_minus1(IGroup)) :-
  domain(f(num_slice_groups_minus1), N), IGroup #&gt;= 0, IGroup #=&lt; N.

f(top_left(IGroup)) :-
  domain(f(num_slice_groups_minus1), N), IGroup #&gt;= 0, IGroup #&lt; N.

f(bottom_right(IGroup)) :-
  domain(f(num_slice_groups_minus1), N), IGroup #&gt;= 0, IGroup #&lt; N.

f(slice_group_change_direction_flag).

f(slice_group_change_rate_minus1).

f(pic_size_in_map_units_minus1).

f(slice_group_id(I)) :-
  domain(f(pic_size_in_map_units_minus1), N), I #&gt;= 0, I #=&lt; N.

f(more_data_flag).          % Context variable for loop termination
f(slice_type).              % Syntax element
f(mbaff_frame_flag).        % Syntax element
f(curr_mb_addr).            % Context variable
f(prev_mb_skipped).         % Context variable
f(field_pic_flag).          % Syntax element / Context variable
f(dByteAligned).               % Derived from byte_aligned() function
f(dPicSizeInMbs).              % Derived value (PicSizeInMbs)
f(dPicSizeInMapUnits).         % Derived value (PicSizeInMapUnits)
f(dInferredMbFieldDecodingFlag). % Derived value for mb_field_decoding_flag inference

f(more_rbsp_data).

f(seq_scaling_matrix_present_flag).

f(chroma_format_idc).

f(dPicScalingListCount).

f(num_ref_idx_l0_default_active_minus1).

f(num_ref_idx_l1_default_active_minus1).

f(weighted_pred_flag).

f(weighted_bipred_idc).

f(pic_init_qp_minus26).

f(pic_init_qs_minus26).

f(chroma_qp_index_offset).

f(deblocking_filter_control_present_flag).

f(constrained_intra_pred_flag).

f(redundant_pic_cnt_present_flag).

f(transform_8x8_mode_flag).

f(pic_scaling_matrix_present_flag).

f(pic_scaling_list_present_flag(I)) :-
  domain(f(dPicScalingListCount), N), I #&gt;= 0, I #&lt; N.

f(second_chroma_qp_index_offset).

f(profile_idc).

f(constraint_set0_flag).

f(constraint_set1_flag).

f(constraint_set2_flag).

f(constraint_set3_flag).

f(constraint_set4_flag).

f(constraint_set5_flag).

f(reserved_zero_2bits).

f(level_idc).

f(chroma_format_idc).

f(separate_colour_plane_flag).

f(bit_depth_luma_minus8).

f(bit_depth_chroma_minus8).

f(qpprime_y_zero_transform_bypass_flag).

f(seq_scaling_matrix_present_flag).

f(seq_scaling_list_present_flag(I)) :-
    domain(f(chroma_format_idc), ChromaFormatIdc),
    (ChromaFormatIdc #\= 3 -&gt; N #= 8 ; N #= 12),
    I #&gt;= 0, I #&lt; N.

f(log2_max_frame_num_minus4).

f(pic_order_cnt_type).

f(log2_max_pic_order_cnt_lsb_minus4).

f(delta_pic_order_always_zero_flag).

f(offset_for_non_ref_pic).

f(offset_for_top_to_bottom_field).

f(num_ref_frames_in_pic_order_cnt_cycle).

f(offset_for_ref_frame(I)) :-
    domain(f(num_ref_frames_in_pic_order_cnt_cycle), N),
    I #&gt;= 0, I #&lt; N.

f(max_num_ref_frames).

f(gaps_in_frame_num_value_allowed_flag).

f(dChromaArrayType).

f(pic_width_in_mbs_minus1).

f(pic_height_in_map_units_minus1).

f(frame_mbs_only_flag).

f(mb_adaptive_frame_field_flag).

f(direct_8x8_inference_flag).

f(frame_cropping_flag).

f(frame_crop_left_offset).

f(frame_crop_right_offset).

f(frame_crop_top_offset).

f(frame_crop_bottom_offset).

f(vui_parameters_present_flag).

f(coeff_token).

f(trailing_ones_sign_flag(I)) :-
    domain(f(residual_block_cavlc, dTotalCoeff), N), I #&gt;= 0, I #&lt; N.

f(level_prefix(I)) :-
    domain(f(residual_block_cavlc, dTotalCoeff), N), I #&gt;= 0, I #&lt; N.

f(level_suffix(I)) :-
    domain(f(residual_block_cavlc, dTotalCoeff), N), I #&gt;= 0, I #&lt; N.

f(total_zeros).

f(run_before(I)) :-
    domain(f(residual_block_cavlc, dTotalCoeff), N), N_minus_1 #= N - 1, I #&gt;= 0, I #&lt; N_minus_1.

f(coded_block_flag).

f(significant_coeff_flag(I)) :-
    domain(f(residual_block_cabac, dNumCoeff), N), N_minus_1 #= N - 1, I #&gt;= 0, I #&lt; N_minus_1.

f(last_significant_coeff_flag(I)) :-
    domain(f(residual_block_cabac, dNumCoeff), N), N_minus_1 #= N - 1, I #&gt;= 0, I #&lt; N_minus_1.

f(delta_pic_order_cnt(1)).

f(direct_spatial_mv_pred_flag).

f(num_ref_idx_active_override_flag).

f(num_ref_idx_l0_active_minus1).

f(num_ref_idx_l1_active_minus1).

f(cabac_init_idc).

f(slice_qp_delta).

f(sp_for_switch_flag).

f(slice_qs_delta).

f(disable_deblocking_filter_idc).

f(slice_alpha_c0_offset_div2).

f(slice_beta_offset_div2).

f(slice_group_change_cycle).

f(rbsp_stop_one_bit).

f(rbsp_alignment_zero_bit).

f(sub_mb_type(MbPartIdx)) :-
  MbPartIdx in 0..3.

f(dSubMbPred).

f(dMbPred).

f(mb_type).

f(dCodedBlockPatternLuma).

f(dCodedBlockPatternChroma).

f(profile_idc).

f(svc_vui_parameters_present_flag).

f(mvc_vui_parameters_present_flag).

f(entropy_coding_mode_flag).

f(dChromaArrayType).

f(dCodedBlockPatternChroma).

f(svc_extension_flag).

f(startIdx).

f(dCurrMbAddr).

f(dMoreDataFlag).

f(dPrevMbSkipped).

f(macroblock_layer).

f(sei_payload).

f(residual_block).

f(slice_type).

f(entropy_coding_mode_flag).

f(mb_skip_run).

f(mbaff_frame_flag).

f(mb_type).

f(transform_size_8x8_flag).

f(dCodedBlockPatternLuma).

f(dMbPartPredMode).

f(dPicScalingListCount).

f(dSeqScalingListCount).

f(dTotalCoeff).

f(coeff_token).

f(dTrailingOnes).

f(endIdx).

f(startIdx).

f(maxNumCoeff).

f(dChromaArrayType).

f(coded_block_flag).

f(significant_coeff_flag(_)).

f(last_significant_coeff_flag(_)).

f(svc_extension_flag).

f(slice_skip_flag).

f(avc_3d_extension_flag).

f(dNumBytesInRBSP).

f(dNalUnitHeaderBytes).

f(svc_extension_flag).

f(avc_3d_extension_flag).

f(nal_unit_type).

f(weighted_pred_flag).

f(slice_type).

f(weighted_bipred_idc).

f(nal_ref_idc).

f(dMoreRbspData).

f(rbsp_trailing_bits).

f(dIdrPicFlag).

f(dDepthFlag).

f(dChromaArrayType).

f(dBitDepthY).

f(dQpBdOffsetY).

f(dBitDepthC).

f(dQpBdOffsetC).

f(dRawMbBits).

f(dFlat_4x4_16(K)) :-
  K #&gt;= 0, K #&lt; 16.

f(dFlat_8x8_16(K)) :-
  K #&gt;= 0, K #&lt; 64.

f(dMaxFrameNum).

f(dMaxPicOrderCntLsb).

f(dExpectedDeltaPerPicOrderCntCycle).

f(offset_for_ref_frame(I)) :-
  domain(f(num_ref_frames_in_pic_order_cnt_cycle), N), I #&gt;= 0, I #&lt; N.

f(dPicWidthInMbs).

f(dPicWidthInSamplesL).

f(dPicWidthInSamplesC).

f(dPicHeightInMapUnits).

f(dPicSizeInMapUnits).

f(dFrameHeightInMbs).

f(dCropUnitX).

f(dCropUnitY).

f(dCroppedWidthL).

f(dCroppedWidthC).

f(dCroppedHeight).

f(dSliceGroupChangeRate).

f(dMbaffFrameFlag).

f(dPicHeightInMbs).

f(dPicHeightInSamplesL).

f(dPicHeightInSamplesC).

f(dPicSizeInMbs).

f(dMaxPicNum).

f(dCurrPicNum).

f(dSliceQPY).

f(dQSY).

f(dFilterOffsetA).

f(dFilterOffsetB).

f(dMapUnitsInSliceGroup0).

f(dCodedBlockPatternLuma).

f(dCodedBlockPatternChroma).

f(dChromaArrayType).

f(dSubWidthC).

f(dSubHeightC).

f(dFrameHeightInMbs).

f(dMbHeightC).

f(dPicWidthInMbs).

f(dMaxFrameNum).

f(dPicSizeInMapUnits).

f(frame_mbs_only_flag).

f(frame_crop_left_offset).

f(frame_crop_right_offset).

f(frame_crop_top_offset).

f(frame_crop_bottom_offset).

f(slice_group_change_rate_minus1).

f(mb_adaptive_frame_field_flag).

f(field_pic_flag).

f(frame_num).

f(pic_init_qp_minus26).

f(slice_qp_delta).

f(pic_init_qs_minus26).

f(slice_qs_delta).

f(slice_alpha_c0_offset_div2).

f(slice_beta_offset_div2).

f(slice_group_change_cycle).

f(coded_block_pattern).

f(dQpy).

f(dQpPrimeY).

f(dTransformBypassModeFlag).

f(dQpyPrev).

f(mb_qp_delta).

f(dQpBdOffsetY).

f(qpprime_y_zero_transform_bypass_flag).

f(chroma_weight_l0(I, J)) :-
    domain(f(num_ref_idx_l0_active_minus1), N_i), I #&gt;= 0, I #=&lt; N_i,
    J #&gt;= 0, J #&lt; 2.

f(chroma_offset_l0(I, J)) :-
    domain(f(num_ref_idx_l0_active_minus1), N_i), I #&gt;= 0, I #=&lt; N_i,
    J #&gt;= 0, J #&lt; 2.

f(chroma_weight_l1(I, J)) :-
    domain(f(num_ref_idx_l1_active_minus1), N_i), I #&gt;= 0, I #=&lt; N_i,
    J #&gt;= 0, J #&lt; 2.

f(chroma_offset_l1(I, J)) :-
    domain(f(num_ref_idx_l1_active_minus1), N_i), I #&gt;= 0, I #=&lt; N_i,
    J #&gt;= 0, J #&lt; 2.

f(mvd_l0(MbPartIdx, CompIdx)) :-
    domain(f(mb_type), MbType),
    domain(f(dNumMbPart(MbType)), NumMbPartVal),
    MbPartIdx #&gt;= 0, MbPartIdx #&lt; NumMbPartVal,
    CompIdx #&gt;= 0, CompIdx #&lt; 2.

f(mvd_l1(MbPartIdx, CompIdx)) :-
    domain(f(mb_type), MbType),
    domain(f(dNumMbPart(MbType)), NumMbPartVal),
    MbPartIdx #&gt;= 0, MbPartIdx #&lt; NumMbPartVal,
    CompIdx #&gt;= 0, CompIdx #&lt; 2.

f(dMbPartPredMode(_MbType, _MbPartIdx)).

f(dI16x16acLevel(Idx, I)) :-
    Idx in 0..15,
    I in 0..14.

f(dLevel4x4(Idx, I)) :-
    Idx in 0..15,
    I in 0..15.

f(dLevel8x8(I8x8, Idx)) :-
    I8x8 in 0..3,
    Idx in 0..63.

f(mvd_l0(MbPartIdx, SubMbPartIdx, CompIdx)) :-
    MbPartIdx in 0..3,
    CompIdx in 0..1,
    domain(f(dNumSubMbPart(MbPartIdx)), N),
    SubMbPartIdx #&gt;= 0, SubMbPartIdx #&lt; N.

f(mvd_l1(MbPartIdx, SubMbPartIdx, CompIdx)) :-
    MbPartIdx in 0..3,
    CompIdx in 0..1,
    domain(f(dNumSubMbPart(MbPartIdx)), N),
    SubMbPartIdx #&gt;= 0, SubMbPartIdx #&lt; N.

% f/2 
f(ref_pic_list_modification, abs_diff_pic_num_minus1).

f(dec_ref_pic_marking, long_term_pic_num).

f(ref_pic_list_modification, ref_pic_list_modification_flag_l1).

f(mb_pred, prev_intra4x4_pred_mode_flag(_Luma4x4BlkIdx)).

f(mb_pred, rem_intra4x4_pred_mode(_Luma4x4BlkIdx)).

f(mb_pred, prev_intra8x8_pred_mode_flag(_Luma8x8BlkIdx)).

f(mb_pred, rem_intra8x8_pred_mode(_Luma8x8BlkIdx)).

f(mb_pred, intra_chroma_pred_mode).

f(sub_mb_pred, ref_idx_l0(_MbPartIdx)).

f(sub_mb_pred, ref_idx_l1(_MbPartIdx)).

f(rbsp_slice_trailing_bits, cabac_zero_word).

f(dec_ref_pic_marking, no_output_of_prior_pics_flag).

f(dec_ref_pic_marking, long_term_reference_flag).

f(dec_ref_pic_marking, adaptive_ref_pic_marking_mode_flag).

f(dec_ref_pic_marking, memory_management_control_operation).

f(dec_ref_pic_marking, difference_of_pic_nums_minus1).

f(dec_ref_pic_marking, long_term_frame_idx).

f(dec_ref_pic_marking, max_long_term_frame_idx_plus1).

f(pic_parameter_set_rbsp, num_ref_idx_l0_default_active_minus1).

f(pic_parameter_set_rbsp, num_ref_idx_l1_default_active_minus1).

f(pic_parameter_set_rbsp, weighted_pred_flag).

f(pic_parameter_set_rbsp, weighted_bipred_idc).

f(pic_parameter_set_rbsp, pic_init_qp_minus26).

f(pic_parameter_set_rbsp, pic_init_qs_minus26).

f(pic_parameter_set_rbsp, chroma_qp_index_offset).

f(pic_parameter_set_rbsp, deblocking_filter_control_present_flag).

f(pic_parameter_set_rbsp, constrained_intra_pred_flag).

f(pic_parameter_set_rbsp, redundant_pic_cnt_present_flag).

f(pic_parameter_set_rbsp, transform_8x8_mode_flag).

f(pic_parameter_set_rbsp, pic_scaling_matrix_present_flag).

f(pic_parameter_set_rbsp, pic_scaling_list_present_flag(I)) :-
  domain(f(dPicScalingListCount), N), I #&gt;= 0, I #&lt; N.

f(pic_parameter_set_rbsp, second_chroma_qp_index_offset).

f(seq_parameter_set_data, profile_idc).

f(seq_parameter_set_data, constraint_set0_flag).

f(seq_parameter_set_data, constraint_set1_flag).

f(seq_parameter_set_data, constraint_set2_flag).

f(seq_parameter_set_data, constraint_set3_flag).

f(seq_parameter_set_data, constraint_set4_flag).

f(seq_parameter_set_data, constraint_set5_flag).

f(seq_parameter_set_data, reserved_zero_2bits).

f(seq_parameter_set_data, level_idc).

f(seq_parameter_set_data, chroma_format_idc).

f(seq_parameter_set_data, separate_colour_plane_flag).

f(seq_parameter_set_data, bit_depth_luma_minus8).

f(seq_parameter_set_data, bit_depth_chroma_minus8).

f(seq_parameter_set_data, qpprime_y_zero_transform_bypass_flag).

f(seq_parameter_set_data, seq_scaling_matrix_present_flag).

f(seq_parameter_set_data, seq_scaling_list_present_flag(I)) :-
    domain(f(chroma_format_idc), ChromaFormatIdc),
    (ChromaFormatIdc #\= 3 -&gt; N #= 8 ; N #= 12),
    I #&gt;= 0, I #&lt; N.

f(seq_parameter_set_data, log2_max_frame_num_minus4).

f(seq_parameter_set_data, pic_order_cnt_type).

f(seq_parameter_set_data, log2_max_pic_order_cnt_lsb_minus4).

f(seq_parameter_set_data, delta_pic_order_always_zero_flag).

f(seq_parameter_set_data, offset_for_non_ref_pic).

f(seq_parameter_set_data, offset_for_top_to_bottom_field).

f(seq_parameter_set_data, num_ref_frames_in_pic_order_cnt_cycle).

f(seq_parameter_set_data, offset_for_ref_frame(I)) :-
    domain(f(num_ref_frames_in_pic_order_cnt_cycle), N),
    I #&gt;= 0, I #&lt; N.

f(seq_parameter_set_data, max_num_ref_frames).

f(seq_parameter_set_data, gaps_in_frame_num_value_allowed_flag).

f(residual(_StartIdx, _EndIdx), dResidualBlock).

f(residual(_StartIdx, _EndIdx), residual_luma).

f(residual(_StartIdx, _EndIdx), dIntra16x16DCLevel).

f(residual(_StartIdx, _EndIdx), dIntra16x16ACLevel).

f(residual(_StartIdx, _EndIdx), dLumaLevel4x4).

f(residual_block_cavlc, dTotalCoeff).

f(residual_block_cavlc, dTrailingOnes).

f(residual_block_cavlc, dSuffixLength).

f(residual_block_cavlc, dEndIdx).

f(residual_block_cavlc, dStartIdx).

f(residual_block_cavlc, dZerosLeft).

f(residual_block_cabac, dMaxNumCoeff).

f(residual_block_cabac, dNumCoeff).

f(seq_parameter_set_data, pic_width_in_mbs_minus1).

f(seq_parameter_set_data, pic_height_in_map_units_minus1).

f(seq_parameter_set_data, frame_mbs_only_flag).

f(seq_parameter_set_data, mb_adaptive_frame_field_flag).

f(seq_parameter_set_data, direct_8x8_inference_flag).

f(seq_parameter_set_data, frame_cropping_flag).

f(seq_parameter_set_data, frame_crop_left_offset).

f(seq_parameter_set_data, frame_crop_right_offset).

f(seq_parameter_set_data, frame_crop_top_offset).

f(seq_parameter_set_data, frame_crop_bottom_offset).

f(seq_parameter_set_data, vui_parameters_present_flag).

f(residual_block_cavlc, coeff_token).

f(residual_block_cavlc, trailing_ones_sign_flag(I)) :-
    domain(f(residual_block_cavlc, dTotalCoeff), N), I #&gt;= 0, I #&lt; N.

f(residual_block_cavlc, level_prefix(I)) :-
    domain(f(residual_block_cavlc, dTotalCoeff), N), I #&gt;= 0, I #&lt; N.

f(residual_block_cavlc, level_suffix(I)) :-
    domain(f(residual_block_cavlc, dTotalCoeff), N), I #&gt;= 0, I #&lt; N.

f(residual_block_cavlc, total_zeros).

f(residual_block_cavlc, run_before(I)) :-
    domain(f(residual_block_cavlc, dTotalCoeff), N), N_minus_1 #= N - 1, I #&gt;= 0, I #&lt; N_minus_1.

f(residual_block_cabac, coded_block_flag).

f(residual_block_cabac, significant_coeff_flag(I)) :-
    domain(f(residual_block_cabac, dNumCoeff), N), N_minus_1 #= N - 1, I #&gt;= 0, I #&lt; N_minus_1.

f(residual_block_cabac, last_significant_coeff_flag(I)) :-
    domain(f(residual_block_cabac, dNumCoeff), N), N_minus_1 #= N - 1, I #&gt;= 0, I #&lt; N_minus_1.

f(slice_header, delta_pic_order_cnt(1)).

f(slice_header, direct_spatial_mv_pred_flag).

f(slice_header, num_ref_idx_active_override_flag).

f(slice_header, num_ref_idx_l0_active_minus1).

f(slice_header, num_ref_idx_l1_active_minus1).

f(slice_header, cabac_init_idc).

f(slice_header, slice_qp_delta).

f(slice_header, sp_for_switch_flag).

f(slice_header, slice_qs_delta).

f(slice_header, disable_deblocking_filter_idc).

f(slice_header, slice_alpha_c0_offset_div2).

f(slice_header, slice_beta_offset_div2).

f(slice_header, slice_group_change_cycle).

f(rbsp_trailing_bits, rbsp_stop_one_bit).

f(rbsp_trailing_bits, rbsp_alignment_zero_bit).

f(sub_mb_pred, sub_mb_type(MbPartIdx)) :-
  MbPartIdx in 0..3.

f(macroblock_layer, dSubMbPred).

f(macroblock_layer, dMbPred).

f(subset_seq_parameter_set_rbsp, seq_parameter_set_data).

f(subset_seq_parameter_set_rbsp, seq_parameter_set_svc_extension).

f(subset_seq_parameter_set_rbsp, svc_vui_parameters_extension).

f(subset_seq_parameter_set_rbsp, seq_parameter_set_mvc_extension).

f(subset_seq_parameter_set_rbsp, mvc_vui_parameters_extension).

f(subset_seq_parameter_set_rbsp, seq_parameter_set_mvcd_extension).

f(subset_seq_parameter_set_rbsp, seq_parameter_set_3davc_extension).

f(subset_seq_parameter_set_rbsp, rbsp_trailing_bits).

f(access_unit_delimiter_rbsp, rbsp_trailing_bits).

f(seq_parameter_set_extension_rbsp, rbsp_trailing_bits).

f(slice_data_partition_c_layer_rbsp, slice_data).

f(slice_data_partition_c_layer_rbsp, rbsp_slice_trailing_bits).

f(rbsp_slice_trailing_bits, rbsp_trailing_bits).

f(residual, dLumaLevel8x8).

f(residual, dNumC8x8).

f(residual, residual_block(ICbCr)) :-
  ICbCr in 0..1.

f(residual, residual_luma).

f(residual, dCbIntra16x16DCLevel).

f(residual, dCbIntra16x16ACLevel).

f(residual, dCbLevel4x4).

f(residual, dCbLevel8x8).

f(residual, dCrIntra16x16DCLevel).

f(residual, dCrIntra16x16ACLevel).

f(residual, dCrLevel4x4).

f(residual, dCrLevel8x8).

f(filler_data_rbsp, rbsp_trailing_bits).

f(prefix_nal_unit_rbsp, prefix_nal_unit_svc).

f(seq_parameter_set_rbsp, seq_parameter_set_data).

f(seq_parameter_set_rbsp, rbsp_trailing_bits).

f(slice_data, dCurrMbAddr).

f(slice_data, dMoreDataFlag).

f(slice_data, dPrevMbSkipped).

f(slice_data, macroblock_layer).

f(sei_message, sei_payload).

f(residual_luma, residual_block).

f(residual_luma, residual_block(I8x8)) :-
  I8x8 in 0..3.

f(pic_parameter_set_rbsp, scaling_list(I)) :-
  domain(f(dPicScalingListCount), N), I #&gt;= 0, I #&lt; N.

f(pic_parameter_set_rbsp, rbsp_trailing_bits).

f(seq_parameter_set_data, scaling_list(I)) :-
  domain(f(dSeqScalingListCount), N), I #&gt;= 0, I #&lt; N.

f(seq_parameter_set_data, vui_parameters).

f(slice_data_partition_b_layer_rbsp, slice_data).

f(slice_data_partition_b_layer_rbsp, rbsp_slice_trailing_bits).

f(slice_layer_without_partitioning_rbsp, slice_header).

f(slice_layer_without_partitioning_rbsp, slice_data).

f(slice_layer_without_partitioning_rbsp, rbsp_slice_trailing_bits).

f(residual_block_cavlc, dSuffixLength).

f(residual_block_cavlc, dLevelVal(I)) :-
  domain(f(dTotalCoeff), N), I #&gt;= 0, I #&lt; N.

f(residual_block_cavlc, dLevelCode(I)) :-
  domain(f(dTotalCoeff), N), I #&gt;= 0, I #&lt; N.

f(dSuffixLength, residual_block_cavlc).

f(dZerosLeft, residual_block_cavlc).

f(dRunValLast, residual_block_cavlc).

f(dCoeffNum, residual_block_cavlc).

f(dCoeffLevelIndexed, residual_block_cavlc).

f(dNumCoeff, residual_block_cabac).

f(dI, residual_block_cabac).

f(dCoeffLevelLast, residual_block_cabac).

f(slice_header_in_scalable_extension, slice_layer_extension_rbsp).

f(slice_data_in_scalable_extension, slice_layer_extension_rbsp).

f(slice_header_in_3davc_extension, slice_layer_extension_rbsp).

f(slice_data_in_3davc_extension, slice_layer_extension_rbsp).

f(slice_layer_extension_rbsp, slice_header).

f(slice_layer_extension_rbsp, slice_data).

f(slice_layer_extension_rbsp, rbsp_slice_trailing_bits).

f(slice_data_partition_a_layer_rbsp, slice_header).

f(slice_data_partition_a_layer_rbsp, slice_data).

f(slice_data_partition_a_layer_rbsp, rbsp_slice_trailing_bits).

f(nal_unit, dNumBytesInRBSP).

f(nal_unit, dNalUnitHeaderBytes).

f(nal_unit, nal_unit_header_svc_extension).

f(nal_unit, nal_unit_header_3davc_extension).

f(nal_unit, nal_unit_header_mvc_extension).

f(slice_header, ref_pic_list_mvc_modification).

f(slice_header, ref_pic_list_modification).

f(slice_header, pred_weight_table).

f(slice_header, dec_ref_pic_marking).

f(sei_rbsp, sei_message).

f(mb_pred, mvd_l0(_MbPartIdx, _CompIdx)).

f(mb_pred, mvd_l1(_MbPartIdx, _CompIdx)).

f(macroblock_layer, residual(0, 15)).

f(residual, dChromaDCLevel(ICbCr, I)) :-
  ICbCr in 0..1, domain(f(residual, dNumC8x8), N), I #&gt;= 0, I #&lt; 4*N.

f(residual_luma, dI16x16acLevel(Idx, I)) :-
    Idx in 0..15,
    I in 0..14.

f(residual_luma, dLevel4x4(Idx, I)) :-
    Idx in 0..15,
    I in 0..15.

f(residual_luma, dLevel8x8(I8x8, Idx)) :-
    I8x8 in 0..3,
    Idx in 0..63.

f(residual_luma, dLevel8x8(I8x8, I)) :-
  I8x8 in 0..3, I in 0..63.

f(sub_mb_pred, mvd_l0(MbPartIdx, SubMbPartIdx, CompIdx)) :-
    MbPartIdx in 0..3,
    CompIdx in 0..1,
    domain(f(dNumSubMbPart(MbPartIdx)), N),
    SubMbPartIdx #&gt;= 0, SubMbPartIdx #&lt; N.

f(sub_mb_pred, mvd_l1(MbPartIdx, SubMbPartIdx, CompIdx)) :-
    MbPartIdx in 0..3,
    CompIdx in 0..1,
    domain(f(dNumSubMbPart(MbPartIdx)), N),
    SubMbPartIdx #&gt;= 0, SubMbPartIdx #&lt; N.

f(residual, residual_block(ICbCr, I8x8, I4x4)) :-
  ICbCr in 0..1, domain(f(residual, dNumC8x8), N), I8x8 #&gt;= 0, I8x8 #&lt; N, I4x4 in 0..3.

f(residual, dChromaACLevel(ICbCr, I8x8, I4x4, I)) :-
  ICbCr in 0..1, domain(f(residual, dNumC8x8), N), I8x8 #&gt;= 0, I8x8 #&lt; N, I4x4 in 0..3, I in 0..14.

f(residual_block_cavlc, dLevelVal(I)) :-
  domain(f(dTotalCoeff), N), I #&gt;= 0, I #&lt; N.

f(residual_block_cavlc, dRunVal(I))  :-
  domain(dTotalCoeff, N), M #= N - 1, I #&gt;= 0, I #&lt; M.

f(residual_block_cabac, dCoeffLevel(I)) :-
  domain(f(maxNumCoeff), N), I #&gt;= 0, I #&lt; N.

% mb_part_pred_mode_is_intra16x16/1 
mb_part_pred_mode_is_intra16x16(_MbType) :-
  fail.

% mb_type/2 
mb_type('I_NxN', 0).

mb_type('I_16x16_0_0_0', 1).

mb_type('I_16x16_1_0_0', 2).

mb_type('I_16x16_2_0_0', 3).

mb_type('I_16x16_3_0_0', 4).

mb_type('I_16x16_0_1_0', 5).

mb_type('I_16x16_1_1_0', 6).

mb_type('I_16x16_2_1_0', 7).

mb_type('I_16x16_3_1_0', 8).

mb_type('I_16x16_0_2_0', 9).

mb_type('I_16x16_1_2_0', 10).

mb_type('I_16x16_2_2_0', 11).

mb_type('I_16x16_3_2_0', 12).

mb_type('I_16x16_0_0_1', 13).

mb_type('I_16x16_1_0_1', 14).

mb_type('I_16x16_2_0_1', 15).

mb_type('I_16x16_3_0_1', 16).

mb_type('I_16x16_0_1_1', 17).

mb_type('I_16x16_1_1_1', 18).

mb_type('I_16x16_2_1_1', 19).

mb_type('I_16x16_3_1_1', 20).

mb_type('I_16x16_0_2_1', 21).

mb_type('I_16x16_1_2_1', 22).

mb_type('I_16x16_2_2_1', 23).

mb_type('I_16x16_3_2_1', 24).

mb_type('I_PCM', 25).

mb_type('B_Direct_16x16', 0).

mb_type('B_L0_16x16', 1).

mb_type('B_L1_16x16', 2).

mb_type('B_Bi_16x16', 3).

mb_type('B_L0_L0_16x8', 4).

mb_type('B_L0_L0_8x16', 5).

mb_type('B_L1_L1_16x8', 6).

mb_type('B_L1_L1_8x16', 7).

mb_type('B_L0_L1_16x8', 8).

mb_type('B_L0_L1_8x16', 9).

mb_type('B_L1_L0_16x8', 10).

mb_type('B_L1_L0_8x16', 11).

mb_type('B_L0_Bi_16x8', 12).

mb_type('B_L0_Bi_8x16', 13).

mb_type('B_L1_Bi_16x8', 14).

mb_type('B_L1_Bi_8x16', 15).

mb_type('B_Bi_L0_16x8', 16).

mb_type('B_Bi_L0_8x16', 17).

mb_type('B_Bi_L1_16x8', 18).

mb_type('B_Bi_L1_8x16', 19).

mb_type('B_Bi_Bi_16x8', 20).

mb_type('B_Bi_Bi_8x16', 21).

mb_type('B_8x8', 22).

% sum_offsets/3 
sum_offsets(N, N, 0).

sum_offsets(I, N, Sum) :-
    I #&lt; N,
    I1 #= I + 1,
    sum_offsets(I1, N, PartialSum),
    domain(f(offset_for_ref_frame(I)), Offset),
    Sum #= PartialSum + Offset.

% type/1 
type(f(luma_log2_weight_denom), ue(v)).

type(f(chroma_log2_weight_denom), ue(v)).

type(f(luma_weight_l0_flag), u(1)).

type(f(luma_weight_l0(_I)), se(v)).

type(f(luma_offset_l0(_I)), se(v)).

type(f(chroma_weight_l0_flag), u(1)).

type(f(luma_weight_l1_flag(_I)), u(1)).

type(f(luma_weight_l1(_I)), se(v)).

type(f(luma_offset_l1(_I)), se(v)).

type(f(chroma_weight_l1_flag(_I)), u(1)).

type(f(mb_type), ue(v)).

type(f(pcm_alignment_zero_bit), f(1)).

type(f(pcm_sample_luma(_I)), u(v)).

type(f(pcm_sample_chroma(_I)), u(v)).

type(f(transform_size_8x8_flag), u(1)).

type(f(coded_block_pattern), me(v)).

type(f(mb_qp_delta), se(v)).

type(f(svc_vui_parameters_present_flag), u(1)).

type(f(bit_equal_to_one), f(1)).

type(f(mvc_vui_parameters_present_flag), u(1)).

type(f(additional_extension2_flag), u(1)).

type(f(additional_extension2_data_flag), u(1)).

type(f(delta_scale(_J)), se(v)).

type(f(primary_pic_type), u(3)).

type(f(seq_parameter_set_id), ue(v)).

type(f(aux_format_idc), ue(v)).

type(f(bit_depth_aux_minus8), ue(v)).

type(f(alpha_incr_flag), u(1)).

type(f(alpha_opaque_value), u(v)).

type(f(alpha_transparent_value), u(v)).

type(f(additional_extension_flag), u(1)).

type(f(slice_id), ue(v)).

type(f(colour_plane_id), u(2)).

type(f(redundant_pic_cnt), ue(v)).

type(f(ref_pic_list_modification_flag_l0), u(1)).

type(f(modification_of_pic_nums_idc(_I)), ue(v)).

type(f(abs_diff_pic_num_minus1), ue(v)).

type(f(long_term_pic_num), ue(v)).

type(f(ref_pic_list_modification_flag_l1), u(1)).

type(f(prev_intra4x4_pred_mode_flag(_)), u(1)).

type(f(rem_intra4x4_pred_mode(_)), u(3)).

type(f(prev_intra8x8_pred_mode_flag(_)), u(1)).

type(f(rem_intra8x8_pred_mode(_)), u(3)).

type(f(intra_chroma_pred_mode), ue(v)).

type(f(ref_idx_l0(_)), te(v)).

type(f(ref_idx_l1(_)), te(v)).

type(f(cabac_zero_word), f(16)).

type(f(no_output_of_prior_pics_flag), u(1)).

type(f(long_term_reference_flag), u(1)).

type(f(adaptive_ref_pic_marking_mode_flag), u(1)).

type(f(memory_management_control_operation), ue(v)).

type(f(difference_of_pic_nums_minus1), ue(v)).

type(f(long_term_frame_idx), ue(v)).

type(f(max_long_term_frame_idx_plus1), ue(v)).

type(f(cabac_alignment_one_bit), u(1)).

type(f(mb_skip_run), ue(v)).

type(f(mb_skip_flag), ae(v)).

type(f(end_of_slice_flag), ae(v)).

type(f(last_payload_type_byte), u(8)).

type(f(last_payload_size_byte), u(8)).

type(f(pic_parameter_set_id), ue(v)).

type(f(entropy_coding_mode_flag), u(1)).

type(f(bottom_field_pic_order_in_frame_present_flag), u(1)).

type(f(num_slice_groups_minus1), ue(v)).

type(f(slice_group_map_type), ue(v)).

type(f(run_length_minus1(_IGroup)), ue(v)).

type(f(top_left(_IGroup)), ue(v)).

type(f(bottom_right(_IGroup)), ue(v)).

type(f(slice_group_change_direction_flag), u(1)).

type(f(slice_group_change_rate_minus1), ue(v)).

type(f(pic_size_in_map_units_minus1), ue(v)).

type(f(slice_group_id(_I)), u(v)). % Length is variable, determined by num_slice_groups_minus1
type(f(more_rbsp_data), u(1)).

type(f(seq_scaling_matrix_present_flag), u(1)).

type(f(chroma_format_idc), ue(v)).

type(f(num_ref_idx_l0_default_active_minus1), ue(v)).

type(f(num_ref_idx_l1_default_active_minus1), ue(v)).

type(f(weighted_pred_flag), u(1)).

type(f(weighted_bipred_idc), u(2)).

type(f(pic_init_qp_minus26), se(v)).

type(f(pic_init_qs_minus26), se(v)).

type(f(chroma_qp_index_offset), se(v)).

type(f(deblocking_filter_control_present_flag), u(1)).

type(f(constrained_intra_pred_flag), u(1)).

type(f(redundant_pic_cnt_present_flag), u(1)).

type(f(transform_8x8_mode_flag), u(1)).

type(f(pic_scaling_matrix_present_flag), u(1)).

type(f(pic_scaling_list_present_flag(_I)), u(1)).

type(f(second_chroma_qp_index_offset), se(v)).

type(f(profile_idc), u(8)).

type(f(constraint_set0_flag), u(1)).

type(f(constraint_set1_flag), u(1)).

type(f(constraint_set2_flag), u(1)).

type(f(constraint_set3_flag), u(1)).

type(f(constraint_set4_flag), u(1)).

type(f(constraint_set5_flag), u(1)).

type(f(reserved_zero_2bits), u(2)).

type(f(level_idc), u(8)).

type(f(chroma_format_idc), ue(v)).

type(f(separate_colour_plane_flag), u(1)).

type(f(bit_depth_luma_minus8), ue(v)).

type(f(bit_depth_chroma_minus8), ue(v)).

type(f(qpprime_y_zero_transform_bypass_flag), u(1)).

type(f(seq_scaling_matrix_present_flag), u(1)).

type(f(seq_scaling_list_present_flag(_)), u(1)).

type(f(log2_max_frame_num_minus4), ue(v)).

type(f(pic_order_cnt_type), ue(v)).

type(f(log2_max_pic_order_cnt_lsb_minus4), ue(v)).

type(f(delta_pic_order_always_zero_flag), u(1)).

type(f(offset_for_non_ref_pic), se(v)).

type(f(offset_for_top_to_bottom_field), se(v)).

type(f(num_ref_frames_in_pic_order_cnt_cycle), ue(v)).

type(f(offset_for_ref_frame(_)), se(v)).

type(f(max_num_ref_frames), ue(v)).

type(f(gaps_in_frame_num_value_allowed_flag), u(1)).

type(f(pic_width_in_mbs_minus1), ue(v)).

type(f(pic_height_in_map_units_minus1), ue(v)).

type(f(frame_mbs_only_flag), u(1)).

type(f(mb_adaptive_frame_field_flag), u(1)).

type(f(direct_8x8_inference_flag), u(1)).

type(f(frame_cropping_flag), u(1)).

type(f(frame_crop_left_offset), ue(v)).

type(f(frame_crop_right_offset), ue(v)).

type(f(frame_crop_top_offset), ue(v)).

type(f(frame_crop_bottom_offset), ue(v)).

type(f(vui_parameters_present_flag), u(1)).

type(f(coeff_token), ce(v)).

type(f(trailing_ones_sign_flag(_I)), u(1)).

type(f(level_prefix(_I)), ce(v)).

type(f(level_suffix(_I)), u(v)).

type(f(total_zeros), ce(v)).

type(f(run_before(_I)), ce(v)).

type(f(coded_block_flag), ae(v)).

type(f(significant_coeff_flag(_I)), ae(v)).

type(f(last_significant_coeff_flag(_I)), ae(v)).

type(f(delta_pic_order_cnt(1)), se(v)).

type(f(direct_spatial_mv_pred_flag), u(1)).

type(f(num_ref_idx_active_override_flag), u(1)).

type(f(num_ref_idx_l0_active_minus1), ue(v)).

type(f(num_ref_idx_l1_active_minus1), ue(v)).

type(f(cabac_init_idc), ue(v)).

type(f(slice_qp_delta), se(v)).

type(f(sp_for_switch_flag), u(1)).

type(f(slice_qs_delta), se(v)).

type(f(disable_deblocking_filter_idc), ue(v)).

type(f(slice_alpha_c0_offset_div2), se(v)).

type(f(slice_beta_offset_div2), se(v)).

type(f(slice_group_change_cycle), u(v)).

type(f(rbsp_stop_one_bit), f(1)).

type(f(rbsp_alignment_zero_bit), f(1)).

type(f(sub_mb_type(_)), ue(v)).

type(f(frame_mbs_only_flag), u(1)).

type(f(frame_crop_left_offset), ue(v)).

type(f(frame_crop_right_offset), ue(v)).

type(f(frame_crop_top_offset), ue(v)).

type(f(frame_crop_bottom_offset), ue(v)).

type(f(slice_group_change_rate_minus1), ue(v)).

type(f(mb_adaptive_frame_field_flag), u(1)).

type(f(field_pic_flag), u(1)).

type(f(pic_init_qp_minus26), se(v)).

type(f(slice_qp_delta), se(v)).

type(f(pic_init_qs_minus26), se(v)).

type(f(slice_qs_delta), se(v)).

type(f(slice_alpha_c0_offset_div2), se(v)).

type(f(slice_beta_offset_div2), se(v)).

type(f(slice_group_change_cycle), ue(v)).

type(f(coded_block_pattern), ue(v)).

type(f(mb_qp_delta), se(v)).

type(f(qpprime_y_zero_transform_bypass_flag), u(1)).

type(f(chroma_weight_l0(_I, _J)), se(v)).

type(f(chroma_offset_l0(_I, _J)), se(v)).

type(f(chroma_weight_l1(_I, _J)), se(v)).

type(f(chroma_offset_l1(_I, _J)), se(v)).

type(f(mvd_l0(_, _)), se(v)).

type(f(mvd_l1(_, _)), se(v)).

type(f(mvd_l0(_, _, _)), se(v)).

type(f(mvd_l1(_, _, _)), se(v)).

type(f(ff_byte), u(8)).

dTotalCoeff.
</div>

<div class="nb-cell markdown" name="md3">
## Main program
</div>

<div class="nb-cell program" data-background="true" data-below="true" name="p3">
:- use_module(library(clpfd)).
:- dynamic provided_value/2.

% TYPES SPECIFICATION
type_range(u(S), 0..U) :- U is 2^S-1.
type_range(ue, 0..sup). 
type_range(ue(v), 0..sup). 
type_range(s(S), 0..U) :- U is 2^S-1.
type_range(se(v), inf..sup). 

range(F, XS) :- F, type(F, T), type_range(T, R), constraints(F, X), X in R, fd_dom(X, XS).
range(F, XS) :- F, type(F, T), type_range(T, R), \+ constraints(F, _X), X in R, fd_dom(X, XS).

set_value(F, _X) :- provided_value(F, _), writeln("Value already set"), fail.
set_value(F, X) :- 
  \+ provided_value(F, _X),
  nonvar(X),
  (depends_on(F, Deps) -&gt;
    forall(member(M, Deps), provided_value(M, _Y));
    true
  ),
  domain(F, Dom), X #= Dom,
  assertz(provided_value(F, X)).

is_calculable(F) :- 
  (depends_on(F, Deps) -&gt;
    forall(member(M, Deps), is_calculable(M));
    provided_value(F, _)
  ).

domain(F, X) :- provided_value(F, X), !.
domain(F, X) :- \+ provided_value(F, _X), \+ is_calculable(F), range(F, R), X in R, !.
domain(F, X) :- \+ provided_value(F, _X), findall(Y, (calculate(F, D), fd_set(D, Y)), Ranges), foldl(fdset_union, Ranges, empty, Union), X in_set Union.

% HELPERS
is_bitstream_field(Field) :- 
    \+ calculate(Field, _).

is_bitstream_field(Field) :- 
    calculate(Field, _),
    default_value(Field, _).

is_derived_field(Field) :- 
    calculate(Field, _),
    \+ default_value(Field, _).

is_dependent_field(Field) :- 
  calculate(Field, _).


is_field_term(Field) :- (is_bitstream_field(Field); is_derived_field(Field)).

% PRINT DERIVATION
calculation_formula(F, Value, Body) :- 
  clause(calculate(F, Value), Body),
  Body.

calculation_formula(F, Value, Body) :- 
    clause(calculate(F, Value), Body).

calculation_formula(F, (calculate(F, Value) :- Body)) :- 
    clause(calculate(F, Value), Body).

explain_derivation(Field) :-
    explain_derivation(Field, [], 0).

explain_derivation(Field, _Visited, _Depth) :-
    is_bitstream_field(Field), !.

explain_derivation(Field, Visited, Depth) :-
    \+ member(Field, Visited),
    depends_on(Field, UsedFields),
    forall(member(UsedField, UsedFields), 
           explain_derivation(UsedField, [Field|Visited], Depth+1)),
    findall(Formula, calculation_formula(Field, Formula), Formulas),
    sort(Formulas, UniqueFormulas),  % Remove duplicates
  	format('=================== FIELD ====================== ~n'),nl,
    forall(member(Formula, UniqueFormulas),
           (portray_clause(Formula))), nl, nl.


% MERMAID
generate_mermaid_graph(Field) :-
    writeln('graph TD'),
    generate_edges(Field),
    nl.

generate_edges(Field) :-
    depends_on(Field, Dependencies),
    generate_edge(Field, Dependencies),
    true.

generate_edge(f(_Field), []) :- true.
generate_edge(f(Field), [f(H)|T]) :-
    format('    ~w --&gt; ~w~n', [H, Field]),
    generate_edge(f(Field), T),
    (is_dependent_field(f(H)) -&gt;
      generate_edges(f(H));
      true
    ).
</div>

<div class="nb-cell markdown" name="md6">
## Queries
</div>

<div class="nb-cell markdown" name="md4">
### Printing all valid values for `CroppedWidthC` and `ChromaArrayType` fields
</div>

<div class="nb-cell query" name="q2">
domain(f(dCroppedWidthC), CroppedWidthC),
domain(f(dChromaArrayType), ChromaArrayType).
</div>

<div class="nb-cell markdown" name="md1">
### Printing all valid values for `CroppedWidthC` and `ChromaArrayType` in "main" profile
</div>

<div class="nb-cell query" name="q1">
set_value(f(profile_idc), 77),
set_value(f(frame_cropping_flag), 0),
domain(f(dCroppedWidthC), CroppedWidthC),
domain(f(dChromaArrayType), ChromaArrayType).
</div>

<div class="nb-cell markdown" name="md8">
### Generating Mermaid graph showing relationship between the fields
</div>

<div class="nb-cell query" name="q3">
generate_mermaid_graph(f(dCroppedWidthC)).
</div>

<div class="nb-cell markdown" name="md10">
### Printing formulas needed for field value calculation
</div>

<div class="nb-cell query" name="q4">
explain_derivation(f(dChromaArrayType)).
</div>

<div class="nb-cell markdown" name="md9">
## Bottom line

If you want to create your own query, you can use the rules and facts defined in the database: `f/1`, `f/2`, `type/2`, `constraints/2`, `depends_on/2` and `calculate/2`.

To refer to a "bitstream field" (one with name written in snake_case) with name `field_name` you need to use `f(field_name)` clause, while to refer to a "derived field" (one with names written in PascalCase) with name `DerivedFieldName` you need to use `f(dDerivedFieldName)` (please note the `d` prefix which is necessary since Prolog treats all the names starting with capital letter as variables).
</div>

</div>