2001-06-06 20:40:57 +01:00
|
|
|
|
|
|
|
:- object(queue,
|
|
|
|
implements(queuep),
|
|
|
|
extends(compound)).
|
|
|
|
|
|
|
|
|
|
|
|
:- info([
|
|
|
|
version is 1.0,
|
2003-02-05 00:15:28 +00:00
|
|
|
author is 'Paulo Moura',
|
2001-06-06 20:40:57 +01:00
|
|
|
date is 2000/7/24,
|
|
|
|
comment is 'Queue predicates implemented using difference lists.']).
|
|
|
|
|
|
|
|
|
|
|
|
as_list(Queue-Back, List) :-
|
|
|
|
Queue == Back ->
|
|
|
|
List = []
|
|
|
|
;
|
|
|
|
List = [Head| Tail],
|
|
|
|
Queue = [Head| Rest],
|
|
|
|
as_list(Rest-Back, Tail).
|
|
|
|
|
|
|
|
|
|
|
|
empty(Front-Back) :-
|
|
|
|
Front == Back.
|
|
|
|
|
|
|
|
|
|
|
|
head(Front-Back, Head) :-
|
|
|
|
Front \== Back,
|
|
|
|
Front = [Head| _].
|
|
|
|
|
|
|
|
|
|
|
|
join(Element, Front-[Element| Back], Front-Back).
|
|
|
|
|
|
|
|
|
|
|
|
join_all([], Queue, Queue).
|
|
|
|
|
|
|
|
join_all([Head| Tail], Queue1, Queue3) :-
|
|
|
|
join(Head, Queue1, Queue2),
|
|
|
|
join_all(Tail, Queue2, Queue3).
|
|
|
|
|
|
|
|
|
|
|
|
jump(Element, Front-Back, [Element| Front]-Back).
|
|
|
|
|
|
|
|
|
|
|
|
jump_all([], Queue, Queue).
|
|
|
|
|
|
|
|
jump_all([Head| Tail], Queue1, Queue3) :-
|
|
|
|
jump(Head, Queue1, Queue2),
|
|
|
|
jump_all(Tail, Queue2, Queue3).
|
|
|
|
|
|
|
|
|
|
|
|
length(Front-Back, Length) :-
|
|
|
|
length(Front, Back, 0, N),
|
|
|
|
Length = N.
|
|
|
|
|
|
|
|
|
|
|
|
length(Front, Back, N, N) :-
|
|
|
|
Front == Back, !.
|
|
|
|
|
|
|
|
length([_|Front], Back, K, N) :-
|
|
|
|
L is K+1,
|
|
|
|
length(Front, Back, L, N).
|
|
|
|
|
|
|
|
|
|
|
|
new(Back-Back).
|
|
|
|
|
|
|
|
|
|
|
|
serve(OldFront-Back, Head, NewFront-Back) :-
|
|
|
|
OldFront \== Back,
|
|
|
|
OldFront = [Head| NewFront].
|
|
|
|
|
|
|
|
|
|
|
|
valid(Queue) :-
|
|
|
|
nonvar(Queue),
|
|
|
|
valid2(Queue).
|
|
|
|
|
|
|
|
|
|
|
|
valid2(Queue-Back) :-
|
|
|
|
Queue == Back,
|
|
|
|
!.
|
|
|
|
|
|
|
|
valid2(Queue-Back) :-
|
|
|
|
nonvar(Queue),
|
|
|
|
Queue = [_| Tail],
|
|
|
|
valid2(Tail-Back).
|
|
|
|
|
|
|
|
|
|
|
|
:- end_object.
|