2016-10-24 9 views
0

まあ、私はプロローグでは非常に新しく、次のような単純な再帰的な問題を解決しようとしています。プロローグで文字列の最初のk文字を抽出する

結果文字列LStr文字列の最初のK文字を取得する機能を実装します。firstKCharacters(Str, K, 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、なぜ私はaa|_1174 isnteadを取得していますが何であるかを説明できますか?

答えて

2

端末のバージョンはfirstKCharacters/3です。書き込み

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

出力リストを空のリストに固定するのは忘れています。それを固定せず

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

を次のようにあなたはそれを書く必要があり、統一されていない変数(3番目の位置に_)のまま:あなた_1174

(オフトピック、そうです)提案:appendを避け、Xを左から右のリストに単純に翻訳してください。私は意味:

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

を次のようにfirstKCharacters/3の他のバージョンを書き、私はカットのようドンクので、私はそれが

firstKCharacters(_, 0, []). 

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

クールずにあなたのバージョンを提案します!説明ありがとう –

+1

誰もカットを好きではありません:) – Fatalize

関連する問題