我想做什么
?- 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,观看了一些视频并阅读了一些文档,但是在第一眼看上去就找不到类似于互联网的东西了。也许有人可以指向某个方向,所以我可以用这个来学习字符串操作。
答案 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'