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
21
As 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
23
is more efficient when it is applicable.
24
25
26
*/
27
set_prolog_flag
:
memberchk
(
X
,[
X
|
_
])
:-
memberchk.
28
memberchk
:
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
39
True when _Set_ is a list, and _Element_ occurs in it. It may be used
40
to test for an element or to enumerate all the elements by backtracking.
41
42
43
*/
44
memberchk
:
member
(
X
,[
X
|
_
]).
45
member
:
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
53
member
:
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
63
Succeeds when _List3_ unifies with the concatenation of _List1_
64
and _List2_. The predicate can be used with any instantiation
65
pattern (even three variables).
66
67
68
*/
69
lists
:
append
([],
L
,
L
).
70
append
:
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
82
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
83
True when _List_ is a list, in which _Element_ may or may not
84
occur, and _Residue_ is a copy of _List_ with all elements
85
identical to _Element_ deleted.
86
87
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
88
*/
89
set_prolog_flag
:
delete
([],
_
, []).
90
delete
:
delete
([
Head
|
List
],
Elem
,
Residue
)
:-
91
Head
=
Elem
,
92
delete
:
delete
(
List
,
Elem
,
Residue
).
93
delete
:
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
105
Unify the well-defined list _L_ with its length. The procedure can
106
be used to find the length of a pre-defined list, or to build a list
107
of length _S_.
108
109
*/
110
111
set_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/2
set_prolog_flag(+ Flag,+ Value)
var/1
var( T)
append/3
append(? List1,? List2,? List3)
delete/3
delete(+ List, ? Element, ? Residue)
identical_member/2
identical_member(?Element, ?Set)
length/2
length(? L,? S)
member/2
member(?Element, ?Set) is true when Set is a list, and Element occurs in it
memberchk/2
memberchk(+ Element, + Set)
pl
bootlists.yap
Generated by
1.9.3