2012-02-18 12 views
3

私は、ユーザーからの単語を読む必要があると2つのいずれかのルールに基づいて音節 に分割:母音・子音・母音、または 母音consonant-子音 - 母音。プロローグ:その後、分割述語を使用して音節の単語「名前」

述語 "名前"が機能しない、出力ではなく、リストでなければならないように見える
助けてもらえますか?入力を処理するとき

vowel(a). 
vowel(e). 
vowel(i). 
vowel(o). 
vowel(u). 
vowel(y). 

consonant(L) :- not(vowel(L)). 

ssplit(A,B) :- atom_chars(A,K),ssplit(K,B,-1). %convert atom to list 
test(A,B) :- append(A,[],F), name(N,F). 

ssplit([],[],0) :- append(L,[],F), name(N,F), writeln(N). 
ssplit([H1|T1],[H1|T2],-1) :- ssplit(T1,T2,0). 

ssplit([H1|T1],[H1|T2],0) :- consonant(H1), ssplit(T1,T2,0). %split to syllables 
ssplit([H1|T1],[H1|T2],0) :- vowel(H1), ssplit(T1,T2,1). 

ssplit([H1|T1],[H1|T2],1) :- vowel(H1), ssplit(T1,T2,1). %split to syllables 
ssplit([H1|[]],[H1|T2],1) :- consonant(H1), ssplit([],T2,0). 
ssplit([H1,H2|[]],[H1,H2|T2],1) :- consonant(H1), vowel(H2), ssplit([],T2,1). 
ssplit([H1,H2|T1],['-',H1,H2|T2],1) :- consonant(H1), vowel(H2), ssplit(T1,T2,1). 
ssplit([H1,H2|T1],T2,1) :- consonant(H1), consonant(H2), ssplit([H1,H2|T1],T2,2). 

ssplit([H1,H2|[]],[H1,H2|T2],2) :- ssplit([],T2,0).  %split to syllables 
ssplit([H1,H2,H3|[]],[H1,H2,H3|T2],2) :- vowel(H3), ssplit([],T2,1). 
ssplit([H1,H2,H3|T1],[H1,'-',H2,H3|T2],2) :- vowel(H3), ssplit(T1,T2,1). 
ssplit([H1,H2,H3|T1],[H1,H2,H3|T2],2) :- consonant(H3), ssplit(T1,T2,0). 



/* 
ssplit(analog,L). 
ssplit(ruler,L). 
ssplit(prolog,L). 


*/ 

答えて

3

DCGは、より実用的である:

split_name(N, L) :- 
    atom_codes(N, Cs), 
    phrase(split_v(L), Cs, []). 

split_v([]) --> []. 

split_v([S|Syllables]) --> 
    vowel(X), 
    consonant(Y), 
    vowel(Z), 
    {atom_codes(S, [X,Y,Z])}, 
    split_v(Syllables). 

split_v([S|Syllables]) --> 
    vowel(V1), 
    consonant(C1), 
    consonant(C2), 
    vowel(V2), 
    {atom_codes(S, [V1,C1,C2,V2])}, 
    split_v(Syllables). 

% catch all unhandled 
split_v([S|Syllables]) --> 
    [C], {atom_codes(S, [C])}, 
    split_v(Syllables). 

vowel(C) --> [C], {vowel(C)}. 
consonant(C) --> [C], {\+vowel(C)}. 

vowel(C) :- memberchk(C, "aeiou"). 

テスト:

?- split_name(stackoverflow,L). 
L = [s, t, acko, v, e, r, f, l, o|...] ; 
L = [s, t, a, c, k, ove, r, f, l|...] ; 
L = [s, t, a, c, k, o, v, e, r|...] ; 
false. 
+0

はありがとう、あなたのプログラムは、問題を見つけるために私を助けました –

関連する問題