假设我有以下规则:
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').
?我在回答有关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/