Prolog 内置函数介绍
Prolog 提供了许多内置(内建)函数,这些函数在 SWI - Prolog 和其他 Prolog 版本中通常都可用。
Prolog 内置函数常用的主要分为:
- 逻辑操作(fail/true/not)
- 数学运算(is, +, -, *, /, mod)
- 列表操作(member, append, length)
- 比较运算(=, ==, <, >)
- I/O 操作(write, read, open, close)
- 动态断言(assertz, retract)
1. 逻辑操作
| 内置谓词 |
作用 |
| true. |
总是成功。 |
| fail. |
总是失败。 |
| not(Goal). 或 + Goal. |
逻辑非(如果 Goal 成功,则失败,反之亦然)。 |
| Goal1, Goal2. |
逗号 , 代表逻辑“与”,两个 Goal 都必须成立。 |
| Goal1 ; Goal2. |
分号 ; 代表逻辑“或”,其中一个 Goal 成立即可。 |
| once(Goal). |
只尝试第一个可能的解决方案,阻止回溯。 |
2. 输入/输出(I/O)
| 内置谓词 |
作用 |
| write(X). |
输出 X,但不换行。 |
| writeln(X). |
输出 X 并换行。 |
| nl. |
输出换行符。 |
| read(X). |
从标准输入读取一个项,并绑定到 X。 |
| writef(‘Hello %w’, [X]). |
格式化输出(类似 C 语言的 printf)。 |
| open(File, Mode, Stream). |
打开文件,Mode 取值 read/write/append。 |
| close(Stream). |
关闭文件流。 |
3. 递归与控制
| 内置谓词 |
作用 |
| call(Goal). |
运行 Goal,相当于动态执行。 |
| repeat. |
进入无限循环,需配合 cut(!)或 fail 终止。 |
| halt. |
终止 Prolog 进程。 |
4. 数学运算
注意:数学运算必须使用 is 赋值!例如:X is 2 + 3. ,此时 X = 5。
| 内置谓词 |
作用 |
| X is A + B. |
加法 |
| X is A - B. |
减法 |
| X is A * B. |
乘法 |
| X is A / B. |
除法(浮点数) |
| X is A // B. |
整数除法 |
| X is A mod B. |
取余数 |
| X is A ^ B. |
幂运算 |
| sqrt(A). |
平方根 |
| abs(A). |
绝对值 |
5. 比较运算
| 内置谓词 |
作用 |
| A = B. |
匹配(A 和 B 结构相同)。 |
| A == B. |
完全相等(不会做变量绑定)。 |
A \== B. |
完全不相等。 |
A \= B. |
匹配失败(A 和 B 结构不同)。 |
| A < B. |
A 小于 B |
| A =< B. |
A 小于等于 B |
| A > B. |
A 大于 B |
| A >= B. |
A 大于等于 B |
6. 列表处理
| 内置谓词 |
作用 |
| length(List, N). |
获取列表 List 的长度 N。 |
| member(X, List). |
判断 X 是否在 List 中。 |
| append(L1, L2, L3). |
L3 是 L1 和 L2 连接后的新列表。 |
| reverse(List, Reversed). |
反转列表。 |
| nth0(Index, List, Elem). |
取索引 Index 处的元素(从 0 开始)。 |
| nth1(Index, List, Elem). |
取索引 Index 处的元素(从 1 开始)。 |
示例
1 2 3 4 5
| ?- member(2, [1,2,3]). true.
?- append([1,2], [3,4], X). X = [1,2,3,4].
|
7. 原子和字符串
| 内置谓词 |
作用 |
| atom(X). |
判断 X 是否是原子(如 apple)。 |
| atom_length(Atom, N). |
获取原子 Atom 的长度。 |
| atom_concat(A, B, C). |
C 是 A 和 B 连接后的原子。 |
| atom_chars(Atom, List). |
Atom 转换为字符列表 List。 |
| string_length(String, N). |
获取字符串 String 长度。 |
示例
1 2 3 4 5
| ?- atom_concat('Hello', 'World', X). X = 'HelloWorld'.
?- atom_chars(hello, X). X = [h, e, l, l, o].
|
8. 断言(动态修改规则)
| 内置谓词 |
作用 |
| assertz(Fact). |
向后添加一个事实/规则。 |
| asserta(Fact). |
向前添加一个事实/规则。 |
| retract(Fact). |
移除一个已知事实/规则。 |
| retractall(Predicate). |
移除所有匹配的规则。 |
示例
1 2 3 4 5 6 7 8
| ?- assertz(age(tom, 25)). true.
?- age(tom, X). X = 25.
?- retract(age(tom, _)). true.
|
9. 文件操作
| 内置谓词 |
作用 |
| open(File, Mode, Stream). |
以 Mode(read/write/append)打开文件 File。 |
| read(Stream, X). |
从 Stream 读取数据到 X。 |
| write(Stream, X). |
向 Stream 写入 X。 |
| close(Stream). |
关闭 Stream。 |
示例
1 2 3 4
| ?- open('data.txt', write, Stream), write(Stream, 'Hello, Prolog!'), close(Stream). true.
|