string - 替换序言中第二次出现的子字符串
问题描述
首先,这不是家庭作业。我正在家里学习计算机科学,以便独自学习更多。
我在做练习。它是这样说的:
构造一个谓词
replaceAtomsString/4
,使得给定一个字符串s
作为第一个参数,一个数字N
作为第二个参数,一对原子[g, h]
(列表)作为第三个参数,在第四个参数中将第 N 个幻影中的g
替换s
统一为h
. 例子:
replaceAtomsString (sAbbbsAbbasA, 2, [sA, cc], X) should result in
X = sAbbbccbbasA
所以,我的第一种方法是尝试用字符串构建一个列表,就像 prolog 对每个字符串所做的那样。毕竟,我已经构建了这段代码:
substitute(X, S, T, Y) :-
append(S, Xt, X), % i.e. S is the first part of X, the rest is Xt
!,
substitute(Xt, S, T, Yt),
append(T, Yt, Y).
substitute([Xh|Xt], S, T, [Xh|Yt]) :-
substitute(Xt, S, T, Yt).
但它会false
在每次尝试时返回。
有任何想法吗?
解决方案
由于您需要大量的工作来完成您的代码,这里是如何使用可用的库来执行任务。
sub_atom /5 它是处理原子的相当强大的谓词。与call_nth /2 相结合,该解决方案比在 N 周围编码循环更简单且更通用。
replaceAtomsString(S,N,[G,H],X) :-
call_nth(sub_atom(S,Before,_,After,G),N),
sub_atom(S,0,Before,_,Left),
sub_atom(S,_,After,0,Right),
atomic_list_concat([Left,H,Right],X).
运行查询的示例,但要计算 N:
?- replaceAtomsString(sAbbbsAbbasA, N, [sA, cc], X).
N = 1,
X = ccbbbsAbbasA ;
N = 2,
X = sAbbbccbbasA ;
N = 3,
X = sAbbbsAbbacc ;
false.
推荐阅读
- alexa-skills-kit - 有谁知道如何在不离开播放屏幕的情况下暂停亚马逊 Alexa 音频播放器?
- python-3.x - 如何在 discord.py 库中设置多个前缀或使前缀不区分大小写?
- tensorflow - tf.TensorArray 允许从未写入的索引中读取?
- bitbucket - Bitbucket Pipelines - 构建不输出构建文件?
- css - 如何在嵌套元素中使用 flexbox 自动边距?
- vue.js - Vue.js 切换类失败
- ios - 提示iOS用户选择要由应用处理的JPEG
- elasticsearch - ElasticSearch 6.7 document creation time
- c++ - 这段代码如何以索引 1 开始一个 C 风格的字符串?
- javascript - 从类属性值字符串解析 json