嗯,我在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
?
答案 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).