这是一个微小的词典和一个由一个句法规则组成的迷你法,我 必须列出该语法可以在顺序中生成的所有句子 Prolog会生成它们,我知道第一句话是:a 罪犯吃了罪犯,但后来我不知道如何找到对方 句子,Prolog翻译如何处理这些案件?我不想要 你给我所有的答案,我只需要一点线索。
word(determiner,a).
word(determiner,every).
word(noun,criminal).
word(noun,'big kahuna burger').
word(verb,eats).
word(verb,likes).
sentence(Word1,Word2,Word3,Word4,Word5):-
word(determiner,Word1),
word(noun,Word2),
word(verb,Word3),
word(determiner,Word4),
word(noun,Word5).
答案 0 :(得分:1)
Prolog有一个关系数据模型,并使用逗号表示AND。 每种单词类型有2种选择,每个单词出现时会有2种解决方案。
生成的下一个短语将使用第一个可用的替代词,并且由于执行模型是深度优先搜索,这样的替代将是罪犯之后的下一个名词
现在,由于Prolog已经用尽了最后一个单词的替代方案,它将“返回”,看看是否有其他确定器可用。它会找到每个,然后它会再次尝试 - 名词的所有替代品等等
答案 1 :(得分:1)
与描述列表时一样,请考虑使用DCG。您的代码可以使用DCG非终结符编写:
determiner --> [a].
determiner --> [every].
noun --> [criminal].
noun --> ['big kahuna burger'].
verb --> [eats].
verb --> [likes].
您的案例中的“句子”是使用以下非终结符号描述的列表:
sentence --> determiner, noun, verb, determiner, noun.
请注意,DCG中的(,)//2
可以读作“然后”。
然后可以使用以下语句枚举用该语法描述的句子:
?- phrase(sentence, Ls).
Ls = [a, criminal, eats, a, criminal] ;
Ls = [a, criminal, eats, a, 'big kahuna burger'] ;
Ls = [a, criminal, eats, every, criminal] ;
etc.
按SPACE键查看更多解决方案。