我想使用 Prolog 制作一个阿拉伯语形态分析器。
我已经实现了以下代码。
check(ي,1,male).
check(ت,1,female).
check(ا,1,me).
dict(لعب,3).
ending('',0,single).
ending(ون,2,plur).
parse([]).
parse(Word,Gender,Verb,Plurality):-
sub_atom(Word,0,LenHead,_,FirstCut),
check(FirstCut,LenHead,Gender),
sub_atom(Word,LenHead,_,LenAfter,Verb),
dict(Verb,LenOfVerb),
Location is LenHead+LenOfVerb,
sub_atom(Word,Location,LenAfter,_,EndOfWord),
ending(EndOfWord,_,Plurality).
这称为使用:
解析(يلعب,A,S,D)。
期望:
A = male
S = لعب
D = single
代码说明: 它应该解析 يلعب 这个词,注意在阿拉伯语中 ي(右边的第一个字母)表示它是阳性词。而 لعب 是一个动词。
错误: 运行代码时,出现以下错误: 错误:解析/4:未定义的过程:dict/2
请注意,当使用英文字母模仿阿拉伯语单词时,代码的行为符合预期,不会产生此错误。
如何解决此类错误,或使 Prolog 理解从 R 到 L 的单词?
编辑: 在附图中,请注意,在红色框中,它成功地将 ي 匹配到男性。在蓝色框中,当它失败时,它应该回溯并开始连接以尝试匹配一个新词,但它却产生了所示的错误
最佳答案
在 Mac 上使用 SWI-Prolog 时必须小心。复制粘贴有点问题。如果您使用 [user],然后经过多行,它不会读取所有行:
这种情况经常发生,与阿拉伯文字或 unicode 等无关。我已向 SWI Prolog 提交错误报告 here .当您使用 [user] 并逐行执行时,您会得到正确的结果。
在上面的截图中你看到我做了一个一个粘贴,因为有多个提示 '|:'。其他 Prolog 系统不一定有这个问题,例如我在 Jekejeke Prolog 中得到:
SWI-Prolog 的最佳解决方法可能是将事实存储在一个文件中,然后从那里查阅它们。在 Jekejeke Prolog 中,我必须调查为什么逗号后的空格显示在错误的一侧。
关于prolog - 使用 R-2-L 字时 Prolog 中的未定义过程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34443028/