我有一套 DCG 规则(在这种情况下是德语人称代词):
% personal pronoun (person, case, number, genus)
ppers(1,0,sg,_) --> [ich].
ppers(1,1,sg,_) --> [meiner].
ppers(1,2,sg,_) --> [mir].
ppers(1,3,sg,_) --> [mich].
ppers(2,0,sg,_) --> [du].
ppers(2,1,sg,_) --> [deiner].
ppers(2,2,sg,_) --> [dir].
ppers(2,3,sg,_) --> [dich].
...
因为它们在语义上是相连的,所以通过将它们移动到列表中(例如按人分组)而不是不相关的规则来保留这些信息对我来说是有意义的。这也使事情变得更整洁:
ppers(1,sg,_,[ich, meiner, mir, mich]).
ppers(2,sg,_,[du,deiner,dir,dich]).
...
然后我会选择我想要的项目,我nth0()
需要的案例是列表中的索引。
但是,我在跟踪程序时注意到,在检查德语句子的语法是否正确并尝试查找某个部分是否是人称代词时,当我使用上层版本(普通规则)时,Prolog 不会遍历每个实例,但是当我使用下面的列表版本时,将浏览每个列表。
这是否意味着如果我使用列表和 nth0 与普通规则相比,性能会更差?还是 Prolog 跟踪器没有像对列表那样显示对普通规则的爬行?
(我希望我可以使我的问题足够明显,否则我会扩展。)