Prolog字符串操作,替换部分字符串

时间:2016-09-14 11:02:08

标签: string prolog

我想做什么

?- string_manipulation(1\2\3,Z).
Z = 1/2/3.
?- string_manipulation(s/t/a/c/k,Z).
Z = s\t\a\c\k.

到目前为止我尝试了什么

sign(/,\).
string_manipulation(Forward,Back):-
         sign(Forward,_\),  

; sign(/,Back).

我会诚实地对待你。我知道这段代码是垃圾。我有点迷失这个。刚刚开始学习Prolog,观看了一些视频并阅读了一些文档,但是在第一眼看上去就找不到类似于互联网的东西了。也许有人可以指向某个方向,所以我可以用这个来学习字符串操作。

2 个答案:

答案 0 :(得分:1)

从帖子标题和谓词名称(所谓的仿函数)看来,你正在寻找像DCG这样的东西,但作为操纵结构化术语和操作符的练习,这里是你的探测器的解决方案:< / p>

string_manipulation(Xs, Ys) :-
    member(( Xo , Yo ), [ ( / , \ ), ( \ , / ) ]),
    Xs =.. [Xo, H, Xt],
    Ys =.. [Yo, T, Yt],
    string_manipulation(H, T),
    string_manipulation(Xt, Yt).
string_manipulation(S, S) :-
    atomic(S).

在SWI-Prolog中,我们需要这个初步声明:

?- op(400,yfx,\).
true.

默认情况下

?- current_op(X,Y,/).
X = 400,
Y = yfx.

?- current_op(X,Y,\).
X = 200,
Y = fy.

声明相同的优先级和关联性有助于使事情更清晰。

修改

@mat的有价值的建议:

string_manipulation(Xs, Ys) :-
    op_replacement(Xo, Yo),
    Xs =.. [Xo, H, Xt],
    ...

op_replacement(/, \).
op_replacement(\, /).

答案 1 :(得分:0)

好像您想用另一个原子替换一个原子中的一个原子。但是您需要在引号周围加上引号,例如'1 \ 2 \ 3'而不是1 \ 2 \ 3,否则引数不是原子,而是术语。

如果您的Prolog系统具有atom_split / 3,则可以从中引导atom_replace / 4。 atom_split/3是Prolog Commons的一部分,您需要一个双向版本。即可以定义:

atom_replace(Source, Old, New, Target) :-
    atom_split(Source, Old, List),
    atom_split(Target, New, List).

这是一些示例运行。不必担心反斜杠反斜杠,只需要输入包含反斜杠的原子即可。使用write / 1的第二个示例显示它不会输入原子:

Jekejeke Prolog 3, Runtime Library 1.3.6

?- atom_replace('1\\2\\3', '\\', '/', X).
X = '1/2/3'

?- atom_replace('s/t/a/c/k', '/', '\\', X), write(X), nl.
s\t\a\c\k
X = 's\\t\\a\\c\\k'