Prolog:代码生成

Dav*_*ked 5 code-generation metaprogramming prolog

从 prolog 程序输出 prolog 代码的最惯用的方法是什么(作为副作用)?

例如,在一个简单的情况下,我可能想编写一个程序,在给定文本输入的情况下,生成另一个将文本表示为有向图的 Prolog 程序。

我知道这个问题有些模糊,但在现有的 Prolog 元编程文献(主要涵盖元循环解释器的应用)中未能找到令人满意的答案后,我已经不再咨询 Stackoverflow。

如果您认为这个问题可以通过其他方式更好地表达,请编辑或发表评论。

mat*_*mat 5

惯用的方法始终是保持纯净避免副作用。

让高层帮你写吧!

生成Prolog 程序,您可以定义一个关系,例如:

program(P) :- ...
Run Code Online (Sandbox Code Playgroud)

然后根据逻辑关系陈述内容 P

例如:

程序(P):-
        P = ( 头部 :- 身体 ),
        头=头(A,B),
        身体=身体(A,B)。

查询和回答示例:

?- 程序(P)。
P = (头(_G261, _G262):-身体(_G261, _G262))。

所以,这就是您的程序,以纯粹的方式生成。

如果你想写它,请使用portray_clause/1

?- 程序(P),描绘子句(P)。
头(A,B):-
        身体(A,B)。
...

这在故障驱动循环中非常有用,可以自动生成许多程序。


Cap*_*liC 1

writeq/1(或format('~q', [...])) 产生可以读回的输出。通常,您还需要在子句主体之后加上句号。例如,尝试

?- A_Clause = (X is 1+Y, write('X is '), write(X), nl), format('~q.~n', [A_Clause]).
Run Code Online (Sandbox Code Playgroud)

代码的可读性因失去变量“好名字”而受到影响,但功能是存在的......

编辑

正如 @false 所指出的,如果输出项以点结束,点之前的空格将避免出现错误

  • 编写可读回的 Prolog 代码的最安全选择是标准的“write_canonical/1-2”谓词。 (2认同)