在prolog中提取字符串的前k个字符

时间:2016-10-24 09:01:11

标签: string recursion prolog

嗯,我在prolog中非常新,我试图解决一些简单的递归问题,如下所示。

实现firstKCharacters(Str, K, L)函数,该函数在结果字符串K中获取字符串Str的第一个L个字符。我已经找到了以下解决方案:

firstKCharacters(_, 0, _):- !.
firstKCharacters([X|L1], K, L):- append([X], S1, L),
    X1 is K - 1, firstKCharacters(L1, X1, S1).

我对结果感到困惑:

?- firstKCharacters([a,b,c,d,e,f,g], 1, X).
X = [a|_1174]

有人可以解释一下_1174是什么以及为什么我a|_1174而不是a

1 个答案:

答案 0 :(得分:2)

您的错误出现在firstKCharacters/3的终端版本中;写

firstKCharacters(_, 0, _):- !.

您忘记将输出列表修复为空列表;你应该写如下

firstKCharacters(_, 0, []) :- !.

如果不修复它,请保持一个不统一的变量(_在第三位):您的_1174

A(关于主题,我猜)建议:避免append并简单地将X从左侧列表转换为右侧列表。我的意思是:编写firstKCharacters/3的其他版本如下

firstKCharacters([X|L1], K, [X|L]):-
    X1 is K - 1, firstKCharacters(L1, X1, L).

因为我喜欢切割,所以我建议你没有它的版本

firstKCharacters(_, 0, []).

firstKCharacters([X|L1], K, [X|L]):- 
    K > 0,
    Km1 is K - 1,
    firstKCharacters(L1, Km1, L).