161
less_eq(A2, E).
% This checks if the address range is in the source of a move
% for any change in S.
moved(A1, A2, S) :-
member(M1, S),
operation(M1, move(B, E, _)),
less_eq(B, A1),
less_eq(A2, E).
next_address(LIST, R, T) :-
proper_addresses(LIST, ALL),
member(T, ALL),
less(R, T),
not(between(ALL, X, R, T)).
between(ALL, X, R, T) :-
member(X, ALL),
member(R, ALL),
member(T, ALL),
less(R, X),
less(X, T).
list_addresses(LIST, V1, [V1 | T]) :-
next_address(LIST, V1, H2), !,
list_addresses(LIST, H2, T).
list_addresses(LIST, V1, [V1]) :-
not(next_address(LIST, V1, X)), !.
address_sequence(List, Result) :-
proper_addresses(List, All), mergesort(All, Result).
% Enumerate all moves with lower priority than the move with ID I.
recessive_moves(I, [], []).
recessive_moves(I, [M | X], [M | S]) :-
is_move(I),
is_move(M),
M =<
less_eq(A2, E).
% This checks if the address range is in the source of a move
% for any change in S.
moved(A1, A2, S) :-
member(M1, S),
operation(M1, move(B, E, _)),
less_eq(B, A1),
less_eq(A2, E).
next_address(LIST, R, T) :-
proper_addresses(LIST, ALL),
member(T, ALL),
less(R, T),
not(between(ALL, X, R, T)).
between(ALL, X, R, T) :-
member(X, ALL),
member(R, ALL),
member(T, ALL),
less(R, X),
less(X, T).
list_addresses(LIST, V1, [V1 | T]) :-
next_address(LIST, V1, H2), !,
list_addresses(LIST, H2, T).
list_addresses(LIST, V1, [V1]) :-
not(next_address(LIST, V1, X)), !.
address_sequence(List, Result) :-
proper_addresses(List, All), mergesort(All, Result).
% Enumerate all moves with lower priority than the move with ID I.
recessive_moves(I, [], []).
recessive_moves(I, [M | X], [M | S]) :-
is_move(I),
is_move(M),
M =<