Dav*_*ked 5 code-generation metaprogramming prolog
从 prolog 程序输出 prolog 代码的最惯用的方法是什么(作为副作用)?
例如,在一个简单的情况下,我可能想编写一个程序,在给定文本输入的情况下,生成另一个将文本表示为有向图的 Prolog 程序。
我知道这个问题有些模糊,但在现有的 Prolog 元编程文献(主要涵盖元循环解释器的应用)中未能找到令人满意的答案后,我已经不再咨询 Stackoverflow。
如果您认为这个问题可以通过其他方式更好地表达,请编辑或发表评论。
最惯用的方法始终是保持纯净并避免副作用。
让高层帮你写吧!
要生成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)。
...
这在故障驱动循环中非常有用,可以自动生成许多程序。
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 所指出的,如果输出项以点结束,点之前的空格将避免出现错误