2016-10-20 3 views
1

Как написать программу в прологе, которая разбивает слово на слоги с использованием предиката: Первый слог гласный-согласный-гласный .. или Второй слог: гласный-согласный-согласный-гласный. Например; abandon = aba-ndon ..Обработка текста в прологе

+0

определить, какие гласные и согласные, затем перебирают слово и анализируют строку. – Carcigenicate

+0

@Carcigenicate звучит хорошо –

+3

Сделайте поиск по «прологам DCG». – lurker

ответ

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 
+0

Это было чрезвычайно, очень полезно. Спасибо вам большое за ваше время. –

+0

@ninjaman, спасибо, я рад помочь. – Yasel

1

Там в общедоступный список слов, расщепляется на «слогов» (не уверен точно, что критерием является) here. Каждая строка - это слово, поэтому вы можете читать слова в один момент времени, разбивать их на слоги и хранить их в некотором динамическом предикате. Предположим, что файл называется mhypth.txt, так как она находится в ссылке выше:

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) 
     ). 

Если вы загрузите это в ваш интерпретатор SWI Prolog, вы можете сделать что-то вроде этого:

?- go. 
true. 

?- word_sylls(A,B). 
A = "Zurich", 
B = ["Zu", "rich"] ; 
A = "Zollner", 
B = ["Zoll", "ner"] ; 
A = "zymurgy", 
B = ["zy", "mur", "gy"] ; 
A = "zymosis", 
B = ["zy", "mo", "sis"] ; 
A = "zymoplastic", 
B = ["zy", "mo", "plas", "tic"] ; 
A = "zymolytic", 
B = ["zy", "mo", "lyt", "ic"] ; 
A = "zymologic", 
B = ["zy", "mo", "log", "ic"] 

?- word_sylls("abandon", Sylls). 
Sylls = ["a", "ban", "don"]. 

?- 
Смежные вопросы