首页 > 解决方案 > 替换序言中第二次出现的子字符串

问题描述

首先,这不是家庭作业。我正在家里学习计算机科学,以便独自学习更多。

我在做练习。它是这样说的:

构造一个谓词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在每次尝试时返回。

有任何想法吗?

标签: stringrecursionreplaceprolog

解决方案


由于您需要大量的工作来完成您的代码,这里是如何使用可用的库来执行任务。

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.

推荐阅读