如何将 prolog 谓词变成 JSON?
How to turn prolog predicates into JSON?
我想知道是否有办法在 SWI-Prolog 中 return 一个 JSON 对象,这样谓词名称成为键,实例化变量成为值。例如:
get_fruit(JS_out):-
apple(A),
pear(P),
to_json(..., JS_out). # How to write this part?
apple("Gala").
pear("Bartlett").
我希望 JS_out
是:
JS_out = {"apple": "Gala", "pear": "Bartlett"}.
我不知道如何使用 prolog_to_json/3
或其他内置函数来实现这一点。虽然关于将 Json 读入 Prolog 的帖子丢失了,但我找不到很多相反的帖子。感谢您的帮助!
鉴于如图所示的硬编码事实,简单的解决方案是:
get_fruit(JS_out) :- apple(A), pear(P), JS_out = {"apple" : A, "pear": B}.
但是,在 Prolog 中,您不需要额外的变量。你可以这样写:
get_fruit({"apple" : A, "pear": B}) :- apple(A), pear(P).
你可以根据任何一种水果来概括这一点:
get_fruit(Fruit1, Fruit2, {Fruit1 : A, Fruit2 : B}) :-
call(Fruit1, A),
call(Fruit2, B).
再多做一点工作,就可以推广到任意数量的水果。
顺便说一句,认为 is/2
是某种通用赋值运算符是初学者常犯的错误,但事实并非如此。它严格用于算术表达式评估,并假定第二个参数是使用 Prolog 支持的算术运算符的完全实例化且可评估的算术表达式。第一个参数是变量或数值。任何不符合这些条件的东西都会失败或产生错误。
我想知道是否有办法在 SWI-Prolog 中 return 一个 JSON 对象,这样谓词名称成为键,实例化变量成为值。例如:
get_fruit(JS_out):-
apple(A),
pear(P),
to_json(..., JS_out). # How to write this part?
apple("Gala").
pear("Bartlett").
我希望 JS_out
是:
JS_out = {"apple": "Gala", "pear": "Bartlett"}.
我不知道如何使用 prolog_to_json/3
或其他内置函数来实现这一点。虽然关于将 Json 读入 Prolog 的帖子丢失了,但我找不到很多相反的帖子。感谢您的帮助!
鉴于如图所示的硬编码事实,简单的解决方案是:
get_fruit(JS_out) :- apple(A), pear(P), JS_out = {"apple" : A, "pear": B}.
但是,在 Prolog 中,您不需要额外的变量。你可以这样写:
get_fruit({"apple" : A, "pear": B}) :- apple(A), pear(P).
你可以根据任何一种水果来概括这一点:
get_fruit(Fruit1, Fruit2, {Fruit1 : A, Fruit2 : B}) :-
call(Fruit1, A),
call(Fruit2, B).
再多做一点工作,就可以推广到任意数量的水果。
顺便说一句,认为 is/2
是某种通用赋值运算符是初学者常犯的错误,但事实并非如此。它严格用于算术表达式评估,并假定第二个参数是使用 Prolog 支持的算术运算符的完全实例化且可评估的算术表达式。第一个参数是变量或数值。任何不符合这些条件的东西都会失败或产生错误。