prolog - 为什么 SWI-Prolog 将带引号和不带引号的字符串(不带空格)统一为同一规则?

标签 prolog unification iso-prolog unify

假设我有以下规则:

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 问题时遇到了这个问题。虽然我能够回答这个人的问题,但我无法解释这种特殊的行为,我想知道其他人是否可以。

最佳答案

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

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

关于prolog - 为什么 SWI-Prolog 将带引号和不带引号的字符串(不带空格)统一为同一规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4100943/

相关文章:

Prolog 表达式简化

Prolog:解决多变量算术

prolog - 替换序言中的空格

prolog - 查找具有相同数量的所有谓词

windows - 如何列出英文算术表达式并得出数值结果

prolog - 如何在 Prolog 中找到 map 上两点之间的公共(public)车站?

types - 要统一的类型变量出现在类型中

haskell - 手动推导 `zipWith . uncurry`的类型

java - 实现统一和跳过变量

prolog - 制作适用于 GNU 和 SWI 的 Prolog 代码