【问题标题】:json get prolog predicatejson获取prolog谓词
【发布时间】:2018-01-08 15:46:49
【问题描述】:

我正在尝试在 prolog 中创建这个谓词:

谓词json_get/3 可以定义为:json_get(JSON_obj, Fields, Result).Result 可通过以下方式恢复时为真 从JSON_obj 开始的Fields(列表)中的字段链。一个领域 由N 表示(N 主编号 o 等于 0)对应于 JSON 数组的索引。

请帮助我理解遵循字段链。

谢谢

编辑1:

当然,所以 json 对象看起来像这样 '{"name" : "Aretha", "surname" : "Franklin"}'。 如果我为此对象 prolog 调用 json_parse 谓词,请告诉我这个

json_obj([(”name”, ”Aretha”), (”surname”, ”Franklin”)]),我们称这个obj为O

json_get我需要这样从O中提取名字,json_get(O, ["name"], R)

编辑2:

在某人的帮助下,现在这是谓词:

json_get(json_obj(JSON_obj), Field, Result) :-
    memberchk((Field,Result), JSON_obj).

json_get(JSON_obj, Fields, Result) :-
    maplist(json_get(JSON_obj), Fields, Result).

所以现在问题是嵌套列表。 例如这个输入

json_parse('{"nome" : "Zaphod",
            "heads" : ["Head1", "Head2"]}', Z),
json_get(Z, ["heads", 1], R).

输出应该是R = "Head2",但谓词不提取字段并失败。

编辑3:

这是 json_parse 的输出

json_obj([("nome", "Zaphod"),  ("heads", json_array(["Head1", "Head2"]))]).

【问题讨论】:

  • 你知道什么是“字段链”吗?你知道JSON_obj 的表示形式是什么样的吗? (为什么我的脑海里会播放一首艾瑞莎·富兰克林的歌?)
  • 谁知道为什么 Aretha 对 Prolog 感兴趣?

标签: json prolog swi-prolog


【解决方案1】:

这个怎么样

json_get(json_obj(Obj),[F|Fs],Res) :-
  member((F,R),Obj),
  json_get(R,Fs,Res).
json_get(json_array(Is),[N|Fs],Res) :-
  nth1(N,Is,R),
  json_get(R,Fs,Res).
json_get(Res,[],Res).

这会在您的第二个示例中产生 Head1 而不是 Head2。如果您不只是打错字,请解释​​这应该如何工作。 (如果它是从零开始的,您只需将nth1/3 更改为nth0/3。)

【讨论】:

  • 我只把nth1换成了nth0,你是我的救命恩人,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多