gpt4 book ai didi

prolog - 在 Prolog 中连接字符串列表

转载 作者:行者123 更新时间:2023-12-04 14:51:41 25 4
gpt4 key购买 nike

我正在编写一个 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之间s 和 main()。另一种解决方案是修改最高级别的转换器来处理列表。它现在看起来像这样:
program(P) --> define(F), {swritef(P, "#include \"lisp2c.h\" \n\n%t \nint main() { return 0; }", [F])}, !.

我将如何做这两个?我正在使用 SWI Prolog。

最佳答案

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

SWI-Prolog 手册:通常我会发布指向 the documentation 的“深层”链接。 ,但 SWI-Prolog 站点使用一种 URL 样式,该样式会通过许多浏览器/插件组合触发跨站点脚本 (XSS) 警告。因此,我将引用相应部分的链接。

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

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

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/3 strSepCat/4 .前者是根据后者定义的,后者是 Prolog 中的典型设计模式,它引入了一个额外的参数作为累加器,当递归完成时绑定(bind)到输出。这种技术通常有助于获得 tail recursive定义。

使用谓词 strSepCat/3 ,我们通常需要用两个换行符(转义序列)构造分隔符字符串:
?- funs(Fs,Lisp,[ ]), string_to_list(Sep,"\n\n"), strSepCat(Fs,Sep,CProg).

关于prolog - 在 Prolog 中连接字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4708235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com