如何在prolog中编写程序,使用谓词将单词分成音节:第一个音节是元音 - 辅音 - 元音..或第二个音节:元音 - 辅音 - 辅音 - 元音。例如;放弃= aba-ndon ..
答案 0 :(得分:2)
这个程序基本上会应用你提到的规则,但我认为它不会成为文字处理的好工具。
vowel(a).
vowel(e).
vowel(i).
vowel(o).
vowel(u).
consonant(L):- not(vowel(L)).
syllable(W, S, RW):- atom_chars(W, [V1, C, V2|Tail]), vowel(V1), consonant(C), vowel(V2), !, atomic_list_concat([V1, C, V2], S), atomic_list_concat(Tail, RW).
syllable(W, S, RW):- atom_chars(W, [V1, C, C2, V2|Tail]), vowel(V1), consonant(C), consonant(C2),vowel(V2), !, atomic_list_concat([V1, C, C2, V2], S), atomic_list_concat(Tail, RW).
syllable(W, W, _).
break(W, B):- syllable(W, B, ''), !.
break(W, B):- syllable(W, S, RW), break(RW, B2), atomic_list_concat([S, '-', B2], B).
该程序定义了元音是什么以及什么不是元音。也是根据你的规则的音节,以及如何打破一个单词。使用谓词'break / 2'你可以测试它:
?- break(abaebbi, B).
B = 'aba-ebbi'
让我怀疑你的规则,除了我的英语不好之外,用我的答案中的每个单词进行测试,总是返回整个单词:)
?-break('syllable', B).
B = syllable
答案 1 :(得分:1)
有一个公开可用的单词列表,分为" syllables" (不确定标准是什么)here。每行都是一个单词,因此您可以一次读取单词,将它们分成音节,并将它们存储在某个动态谓词中。假设文件名为sudo pip install --no-cache-dir flask
,就像它在上面的链接一样:
mhypth.txt
如果将其加载到SWI Prolog解释器中,则可以执行以下操作:
go :-
%% I don't know why 65533 is the code for the separator, but it is.
string_codes(Sep, [65533]),
setup_call_cleanup(
open(<Path to mhyph.txt>>, read, St),
read_sylls(St, Sep),
close(St)
).
:- dynamic word_sylls/2.
read_sylls(Stream, Sep) :-
read_line_to_string(Stream, S),
(S == end_of_file -> true
;
split_string(S, Sep, Sep, Parts),
atomics_to_string(Parts, Word),
asserta(word_sylls(Word, Parts)),
read_sylls(Stream, Sep)
).