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.