4

前提

所以我试图将给定的字符串分解成一个字符列表,然后这些字符将被编辑/更改并重新分配到列表中,之后列表将被重建回字符串。

一个例子:

给定String : "ABCDEFG"

特点list : [A,B,C,D,E,F,G]

操作将列表更改为类似以下内容:[E,F,G,H,I,J,K](或类似内容)。

然后被重构为一个字符串:

"EFGHIJK"

问题

我正在寻找一种方法来访问字符串中的单个元素。如果是 Java,我会使用类似的命令,charAt(int i)但我不知道 prolog 中是否存在这样的命令。

笔记

我是一名新prolog程序员,所以我对大多数prolog操作都不熟悉。

谢谢你的时间。

4

3 回答 3

3

字符串是字符代码列表,而原子是原子,即不可分割,但是有sub_atom /5 可以访问部分原子数据。

这里有一些字符串示例:

1 ?- L = "ABCDEF".
L = [65, 66, 67, 68, 69, 70].

2 ?- L = "ABCDEF", maplist(succ, L, N), format('~s', [N]).
BCDEFG
L = [65, 66, 67, 68, 69, 70],
N = [66, 67, 68, 69, 70, 71].

3 ?- L = "ABCDEF", maplist(succ, L, N), format('~s', [N]), atom_codes(A, N).
BCDEFG
L = [65, 66, 67, 68, 69, 70],
N = [66, 67, 68, 69, 70, 71],
A = 'BCDEFG'.

如果分析和转换需要细节,那么通常最好使用 DCG

于 2012-12-05T20:48:05.333 回答
1

字符串是 Prolog 中的原子。

在您的情况下,您可以执行以下操作:“EFGHIJK”= List.

这是一篇关于它的好帖子:http: //obvcode.blogspot.com/2008/11/working-with-strings-in-prolog.html

于 2012-12-05T17:35:33.823 回答
1

你可以试试这个

t(S_in, S_out) :-
    maplist(modif, S_in, S_temp),
    string_to_list(S_out, S_temp).


modif(In, Out) :-
    atom_codes('A', [X]),
    atom_codes('E', [Y]),
    Out is In + Y - X.

字符串是 Prolog 中的代码列表。因此 maplist 对列表的每个代码都进行了修改(一种功能方式)。string_to_list 对于在输出中获取字符串而不是代码列表很有用。

您可以快速编写 modif,但我以您可以轻松理解的方式编写它。

输出是

?- t("ABCDEFG", Out).
Out = "EFGHIJK".
于 2012-12-05T17:41:47.780 回答