Prolog:单引号和双引号的不同行为

Ion*_*nut 4 portability prolog double-quotes prolog-assert

我对 Prolog 很陌生,我偶然发现了一些我不明白的东西。

这是我的代码:

:- dynamic user/3.
user('id', 'Name', 20).

changeAge(Id, NewAge) :-
   user(Id, Name, _),
   retract(user(Id,_,_)),
   assert(user(Id,Name,NewAge)).
Run Code Online (Sandbox Code Playgroud)

要更新数据库中的用户信息, changeAge/2请执行以下三个步骤:

  1. 使用 查找正确的记录user/3
  2. 使用 . 从数据库中删除一条匹配的记录retract/1
  3. 使用 . 将新的更新记录插入数据库assert/1

这是我的控制台输出:

1 ?- user('id', _, Age).
Age = 20.

2 ?- changeAge('id', 25).
true.

3 ?- user('id', _, Age).
Age = 25.

4 ?- changeAge("id", 30).
false.

5 ?- user('id', _, Age).
Age = 25.
Run Code Online (Sandbox Code Playgroud)

为什么单引号给我true(第 2 行),而双引号给我false(第 4 行)?

rep*_*eat 6

TL;DR 1 阅读Prolog 中“ ' 和 ” 之间的区别是什么?”。

TL;DR 2当且仅当Prolog 标志double_quotes设置为时,目标成功。'id' = "id"atom

Prolog 标志 可以double_quotes在运行时使用以下命令设置set_prolog_flag/2

  • ?- set_prolog_flag(double_quotes, chars).

    ?-“id”=“id”。
    错误的
  • ?- set_prolog_flag(double_quotes, codes).

    ?-“id”=“id”。
    错误的
  • ?- set_prolog_flag(double_quotes, atom).

    ?-“id”=“id”。
    真的

有关更多信息,请阅读SICStus Prolog 手册页中的“字符串作为列表”!