89 lines
1.3 KiB
Plaintext
89 lines
1.3 KiB
Plaintext
|
|
||
|
:- object(queue,
|
||
|
implements(queuep),
|
||
|
extends(compound)).
|
||
|
|
||
|
|
||
|
:- info([
|
||
|
version is 1.0,
|
||
|
authors is 'Paulo Moura',
|
||
|
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.
|