gpt4 book ai didi

prolog - 文字处理序言

转载 作者:行者123 更新时间:2023-12-01 09:49:47 25 4
gpt4 key购买 nike

我试图根据 2 种不同的规则将一个单词分成 Prolog 中的不同音节..

rule 1: vowel-consonant-vowel (break word after second vowel)
rule 2: vowel-consonant-consonant-vowel (break word between the 2 consonant) , for example, calculator = cal-cula-tor ..

我在 Prolog 中已有以下代码,但是,它只分析单词的前 3 或 4 个字母..

我需要它来处理和分析整个单词。

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

最佳答案

首先,一个设置可以更方便地指定字符列表,如果您经常处理文本,我建议您在代码中使用它:

:- set_prolog_flag(double_quotes, chars).

其次,数据以定义可以所有方向使用的方式表示:

vowel(a). vowel(e). vowel(i). vowel(o). vowel(u).consonant(C) :- maplist(dif(C), [a,e,i,o,u]).

例如:

?- consonant(C).dif(C, u),dif(C, o),dif(C, i),dif(C, e),dif(C, a).

鉴于您发布的版本不正确没有辅音:

?- consonant(C).false.

您概述的规则很容易在 Prolog 中描述:

% rule 1: vowel-consonant-vowel (break after second vowel)rule([V1,C,V2|Rest], Bs0, Bs, Rest) :-        vowel(V1), consonant(C), vowel(V2),        reverse([V2,C,V1|Bs0], Bs).% rule 2: vowel-consonant-consonant-vowel (break between the consonants)rule([V1,C1,C2,V2|Rest], Bs0, Bs, [C2,V2|Rest]) :-        vowel(V1), consonant(C1), consonant(C2), vowel(V2),        reverse([C1,V1|Bs0], Bs).% alternative: no break at this positionrule([L|Ls], Bs0, Bs, Rest) :-        rule(Ls, [L|Bs0], Bs, Rest).

练习:为什么我要写 [V2,C,V1|_] 而不是 [V1,C,V2|...]reverse/2 的调用中?

现在,只剩下描述结果音节的列表了。使用 很容易符号:

word_breaks([]) --> [].word_breaks([L|Ls]) --> [Bs],        { rule([L|Ls], [], Bs, Rest) },        word_breaks(Rest).word_breaks([L|Ls]) --> [[L|Ls]].

现在的重点是:由于这个程序是完全并且不会过早地错误地提交,我们可以用它来证明还有其他 可接受的连字符:

?- phrase(word_breaks("calculator"), Hs).Hs = [[c, a, l], [c, u, l, a], [t, o, r]] ;Hs = [[c, a, l], [c, u, l, a, t, o], [r]] ;Hs = [[c, a, l], [c, u, l, a, t, o, r]] ;Hs = [[c, a, l, c, u, l, a], [t, o, r]] ;Hs = [[c, a, l, c, u, l, a, t, o], [r]] ;Hs = [[c, a, l, c, u, l, a, t, o, r]].

在 Prolog 中,保持代码的通用性 是一种很好的做法,这样您就可以很容易地观察到替代解决方案。参见 .

关于prolog - 文字处理序言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40308854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com