JSON 的 SWI-Prolog 语法

问题描述

json([ name='Demo term',created=json([day= @null,month='December',year=2007]),confirmed= @true,members=[1,2,3]
     ])

我正在看 swi prolog 手册,但不明白其中的语法 (https://linkedpolitics.project.cwi.nl/swish/pldoc/man?section=jsonsupport),而且我无法找出合适的搜索词。 这是什么意思? name='Demo term', 还有这个? [day= @null 还有这个? members=[1,3] 这些是一些特殊的语法还是只是奇怪的原子?

解决方法

这个语法真的没有什么特别之处:

json/1 是一个以列表为唯一参数的复合词。

该列表有条目

  • name='Demo term'
  • created=json([day= @null,month='December',year=2007])
  • confirmed= @true
  • members=[1,2,3]

显然试图模拟地图关键字 -> 值:

  • 关键字 name 与原子“Demo term”相关联(使用单引号,因为它包含一个空格并以大写开头
  • 关键字 created 与复杂的复合词 json([day= @null,year=2007]) 相关联
  • 关键字 confirmed 与复合词 @true 相关联,最好写成 @(true)
  • 关键字 member 与列表 [1,3] 相关联

请注意 https://eu.swi-prolog.org/pldoc/man?section=jsonsupport

处的此说明

JSON 常量 true 和 false 像 JPL 一样映射到 @(true) 和 @(false)。 JSON 常量 null 映射到 Prolog 术语 @(null)

虽然不得不写

X='@'(true).

所以也许这个例子是愚蠢的。

您可以在 SWI-Prolog 的命令行执行此操作以将术语打印在 规范模式(为可读性添加了换行符;我的观点是 write_canonical 也应该正确缩进,遗憾的是它没有缩进):

?- write_canonical(json([ name='Demo term',|           created=json([day= '@'(null),year=2007]),|           confirmed= '@'(true),|           members=[1,3]
|         ])).
json([=(name,'Demo term'),=(created,json(
                  [=(day,@(null)),=(month,'December'),=(year,2007)]
                )
       ),=(confirmed,@(true)),=(members,[1,3])])
true.