5

假设我有以下规则:

unify('test', 'this is a test').
run :- write('Enter something: '), 
       read(X), 
       unify(X, Y), 
       write('The answer is '), write(Y).

然后我按如下方式运行它:

?- ['unify.pl'].
% unify.pl compiled 0.00 sec, -48 bytes
true.

?- run.
Enter something: test.
The answer is this is a test
true.

?- run.
Enter something: 'test'.
The answer is this is a test
true.

为什么 SWI-Prolog 统一test'test'unify('test', 'this is a test').?我在回答关于 SO 的 Prolog 问题时遇到了这个问题。虽然我能够回答这个人的问题,但我无法解释这种特殊行为,我想知道其他人是否可以。

4

2 回答 2

5

虽然 SWI-PROLOG 中的原子可以使用单引号来表示,例如 ,但当 SWI-PROLOG 解析器可以从通常以小写字母字符开始的字符序列中识别原子时,不需要'This is an atom'单引号,例如。如果序列包含空格(或其他一些字符),则需要单引号来正确表示原子。字母数字字符和某些标点符号(如下划线)都可以,例如.test_test5_6

如果没有单引号的字符序列以其他任何字符开头,例如数字6k,解析器会将其视为number; 如果它是大写字母字符,例如Test,解析器会将其视为变量。

于 2010-11-04T20:36:33.600 回答
3

这不是 SWI 特定的行为 - 它是标准要求的。有一个简单的方法可以看到这一点。您也可以将其用于语法不明显的任何其他术语。在顶层键入:

?- X = '测试'。
X = 测试。

?- X = '这是一个测试'。
X = '这是一个测试'。

答案始终是有效的 Prolog 文本——这是特定于 SWI 的,但也适用于许多其他 Prolog 系统,如 YAP、GNU、B、IF、SICStus。

另一种查看方式是使用 write_canonical/1:

?- write_canonical('这是一个测试')。
'这是一个测试'
真的。

?- write_canonical([a,b,(c,d),{e,f}])。
'.'(a,'.'(b,'.'(','(c,d),'.'({}(','(e,f)),[]))))
于 2010-11-04T22:37:20.550 回答