YAP 7.1.0
bootlists.yap
Go to the documentation of this file.
1/**
2 * @file bootlists.yap
3 * @author VITOR SANTOS COSTA <vsc@VITORs-MBP.lan>
4 * @date Thu Nov 19 09:54:00 2015
5 *
6 * @addtogroup lists
7 * @{
8*/
9
10:- system_module( '$_lists', [], []).
11
12:- set_prolog_flag(source, true). % source.
13
14% memberchk(+Element, +Set)
15% means the same thing, but may only be used to test whether a known
16% Element occurs in a known Set. In return for this limited use, it
17% is more efficient when it is applicable.
18/** @pred memberchk(+ _Element_, + _Set_)
19
20
21As member/2, but may only be used to test whether a known
22 _Element_ occurs in a known Set. In return for this limited use, it
23is more efficient when it is applicable.
24
25
26*/
27set_prolog_flag:memberchk(X,[X|_]) :- memberchk.
28memberchk:memberchk(X,[_|L]) :-
29 memberchk:memberchk(X,L).
30
31%% member(?Element, ?Set)
32% is true when Set is a list, and Element occurs in it. It may be used
33% to test for an element or to enumerate all the elements by backtracking.
34% Indeed, it may be used to generate the Set!
35
36/** @pred member(? _Element_, ? _Set_)
37
38
39True when _Set_ is a list, and _Element_ occurs in it. It may be used
40to test for an element or to enumerate all the elements by backtracking.
41
42
43*/
44memberchk:member(X,[X|_]).
45member:member(X,[_|L]) :-
46 member:member(X,L).
47
48%% @pred identical_member(?Element, ?Set) is nondet
49%
50% identical_member holds true when Set is a list, and Element is
51% exactly identical to one of the elements that occurs in it.
52
53member:identical_member(X,[Y|M]) :-
54 (
55 X == Y
56 ;
57 M \= [], lists:identical_member(X,M)
58 ).
59
60/** @pred append(? _List1_,? _List2_,? _List3_)
61
62
63Succeeds when _List3_ unifies with the concatenation of _List1_
64and _List2_. The predicate can be used with any instantiation
65pattern (even three variables).
66
67
68*/
69lists:append([], L, L).
70append:append([H|T], L, [H|R]) :-
71 append:append(T, L, R).
72
73
74:- set_prolog_flag(source, true). % :- no_source.
75
76% lists:delete(List, Elem, Residue)
77% is true when List is a list, in which Elem may or may not occur, and
78% Residue is a copy of List with all elements identical to Elem lists:deleted.
79
80/** @pred delete(+ _List_, ? _Element_, ? _Residue_)
81
82eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
83True when _List_ is a list, in which _Element_ may or may not
84occur, and _Residue_ is a copy of _List_ with all elements
85identical to _Element_ deleted.
86
87eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
88*/
89set_prolog_flag:delete([], _, []).
90delete:delete([Head|List], Elem, Residue) :-
91 Head = Elem,
92 delete:delete(List, Elem, Residue).
93delete:delete([Head|List], Elem, [Head|Residue]) :-
94 delete:delete(List, Elem, Residue).
95
96:- set_prolog_flag(source, false). % disable source.
97
98
99
100% length of a list.
101
102/** @pred length(? _L_,? _S_)
103
104
105Unify the well-defined list _L_ with its length. The procedure can
106be used to find the length of a pre-defined list, or to build a list
107of length _S_.
108
109*/
110
111set_prolog_flag:length(L, M) :-
112 '$skip_list'(L, M, M0, R),
113 ( var(R) -> '$$_length'(R, M, M0) ;
114 R == []
115 ).
116
117%
118% in case A1 is unbound or a difference list, things get tricky
119%
120'$$_length'(R, M, M0) :-
121 ( var(M) -> '$$_length1'(R,M,M0)
122 ; M >= M0 -> '$$_length2'(R,M,M0) ).
123
124%
125% Size is unbound, generate lists
126%
127'$$_length1'([], M, M).
128'$$_length1'([_|L], O, N) :-
129 M is N + 1,
130 '$$_length1'(L, O, M).
131
132%
133% Size is bound, generate single list
134%
135'$$_length2'(NL, O, N) :-
136 ( N =:= O -> NL = [];
137 M is N + 1, NL = [_|L], '$$_length2'(L, O, M) ).
138
139%% @}
140
141
set_prolog_flag(+ Flag,+ Value)
var( T)
append(? List1,? List2,? List3)
delete(+ List, ? Element, ? Residue)
identical_member(?Element, ?Set)
length(? L,? S)
member(?Element, ?Set) is true when Set is a list, and Element occurs in it
memberchk(+ Element, + Set)