157
%%%
% Now we will define predicates for "proper" addresses. These are
addresses
% that are actually in A'(S), selected as part of the final address
space for
% a P-sequence. Proper addresses are defined in terms of a change set,
naturally.
proper_address_for(LIST, A) :-
legal_address_for(LIST, A),
proper(LIST, A).
proper(LIST, address([], 0)).
proper(LIST, address([I], Index)) :-
valid_index(I, Index),
!.
proper(LIST, address([I|T], Index)) :-
proper(LIST, address(T, Index)),
operation(I, move(A1, A2, _)),
less_eq(A1, address(T, Index)),
less_eq(address(T, Index), A2),
!.
proper(LIST, address([I|T], Index)) :-
proper(LIST, address(T, Index)),
operation(I, copy(A1, A2, _)),
less_eq(A1, address(T, Index)),
less_eq(address(T, Index), A2),
!.
% Print all the legal addresses.
print_legal_addresses(LIST) :- legal_address_for(LIST, A), display(A),
nl, fail.
% Print all the proper addresses.
print_proper_addresses(LIST) :- proper_address_for(LIST, A),
display(A), nl, fail.
proper_addresses(LIST, R) :- findall(X, proper_address_for(LIST, X),
R).
legal_addresses(LIST, R) :- findall(X, legal_address_for(LIST, X), R).
% Define the dest function. This returns the target address of a data-
creating
% change. These possibilities are all mutually exclusive.
dest(ID, Where) :- operation(ID, insert(Where, _)), !.
%%%
% Now we will define predicates for "proper" addresses. These are
addresses
% that are actually in A'(S), selected as part of the final address
space for
% a P-sequence. Proper addresses are defined in terms of a change set,
naturally.
proper_address_for(LIST, A) :-
legal_address_for(LIST, A),
proper(LIST, A).
proper(LIST, address([], 0)).
proper(LIST, address([I], Index)) :-
valid_index(I, Index),
!.
proper(LIST, address([I|T], Index)) :-
proper(LIST, address(T, Index)),
operation(I, move(A1, A2, _)),
less_eq(A1, address(T, Index)),
less_eq(address(T, Index), A2),
!.
proper(LIST, address([I|T], Index)) :-
proper(LIST, address(T, Index)),
operation(I, copy(A1, A2, _)),
less_eq(A1, address(T, Index)),
less_eq(address(T, Index), A2),
!.
% Print all the legal addresses.
print_legal_addresses(LIST) :- legal_address_for(LIST, A), display(A),
nl, fail.
% Print all the proper addresses.
print_proper_addresses(LIST) :- proper_address_for(LIST, A),
display(A), nl, fail.
proper_addresses(LIST, R) :- findall(X, proper_address_for(LIST, X),
R).
legal_addresses(LIST, R) :- findall(X, legal_address_for(LIST, X), R).
% Define the dest function. This returns the target address of a data-
creating
% change. These possibilities are all mutually exclusive.
dest(ID, Where) :- operation(ID, insert(Where, _)), !.