Prolog中连接字符串列表

我正在编写一个 Lisp 到 C 的转换器,并且在处理字符串时遇到了问题。这是一个将一元 Lisp 函数转换为等效 C 代码的代码:

define(F) --> fun_unary(F), !.fun_unary(F) --> "(define (", label(Fun), spaces, label(Arg1), ")", spaces, expr(Body), ")",  {swritef(F, "data *%t(data *%t) { return(%t); }", [Fun, Arg1, Body])}, !.funs([F])  --> define(F), !.funs([F|Fs]) --> define(F), spaces, funs(Fs), !.

现在我想读取任意数量的函数,并将它们作为一个字符串返回。上面的 funs 是我能想到的最好的,但它的工作方式如下:

?- funs(F, "(define (carzero l) (= (car l) 0)) (define (zero n) (= 0 n))", []).F = ["data *carzero(data *l) { return(eq(car(l), make_atom_int(0))); }", "data *zero(data *n) { return(eq(make_atom_int(0), n)); }"].

而我想要这样的:

F = "data *carzero(data *l) { return(eq(car(l), make_atom_int(0))); }\n\ndata *zero(data *n) { return(eq(make_atom_int(0), n)); }".

这样我就可以很好地使用 swritef 将它放到一个完整的程序中,放在 #include 和 main() 之间。另一种解决方案是修改最高级别的转换器来处理列表。它目前看起来像这样:

program(P) --> define(F), {swritef(P, "#include \"lisp2c.h\" \n\n%t \nint main() { return 0; }", [F])}, !.

我该如何实现这两个中的任何一个?我正在使用 SWI Prolog。


回答:

暂且不考虑其用途,让我们编写一个 Prolog 谓词,将字符串列表连接成一个字符串,并在每对连续的字符串之间放置一个双换行符(但不在输出字符串的末尾,从@Jerry发布的示例来看)。

SWI-Prolog 手册: 通常我会发布指向文档的“深度”链接,但 SWI-Prolog 网站使用的 URL 样式会在许多浏览器/插件组合中触发跨站点脚本 (XSS) 警告。因此,我将链接到相应的章节。

第 4.22 节“以字符串形式表示文本”部分内容说:“默认情况下,字符串对象没有词法表示,因此只能使用以下谓词或通过外部语言接口创建。” 这可能会有点令人困惑,因为 SWI-Prolog 将字符串写为双引号文本,但(默认情况下)将双引号文本读取为字符代码列表。

这是将列表中字符串连接起来的谓词的代码,在连续的字符串对之间插入另一个字符串 Separator:

strSepCat([ ],_,Empty) :-    string_to_list(Empty,[ ]).strSepCat([H|T],Separator,StrCat) :-    strSepCat(T,Separator,H,StrCat).strSepCat([ ],_,StrCat,StrCat).strSepCat([H|T],Sep,Str,Cat) :-    string_concat(Sep,H,SepH),    string_concat(Str,SepH,StrSepH),    strSepCat(T,Sep,StrSepH,Cat).

请注意,我们定义了两个谓词,strSepCat/3strSepCat/4。前者是根据后者定义的,这是 Prolog 中的一种典型设计模式,引入一个额外的参数作为累加器,在递归完成时绑定到输出。这种技术通常有助于获得尾递归定义。

要使用谓词 strSepCat/3,我们通常需要构造带有(转义序列的)两个换行符的分隔符字符串:

?- funs(Fs,Lisp,[ ]), string_to_list(Sep,"\n\n"), strSepCat(Fs,Sep,CProg).

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注