Prolog 这个语法可以生成哪些句子?

Prolog 这个语法可以生成哪些句子?,prolog,grammar,dcg,Prolog,Grammar,Dcg,这是一个很小的词典和一个小语法,它由一个语法规则I组成 必须按顺序列出该语法可以生成的所有句子 我知道序言将在中生成它们,第一句话是:a 罪犯吃了一个罪犯,但我不知道如何找到另一个 在这些情况下,Prolog解释器是如何工作的?我不想要 你给我所有的答案,我只需要一点线索 word(determiner,a). word(determiner,every). word(noun,criminal). word(noun,'big kahuna burger'). word(verb,eats).

这是一个很小的词典和一个小语法,它由一个语法规则I组成 必须按顺序列出该语法可以生成的所有句子 我知道序言将在中生成它们,第一句话是: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).

Prolog有一个关系数据模型,并使用逗号表示和。 每个词有两种选择,然后每个词出现有两种解决方案

生成的下一个短语将使用可用的第一个备选方案,并且由于执行模型是深度优先搜索,因此该备选方案将是刑事后的下一个名词


现在,由于Prolog用尽了最后一个单词的替代方法,它将“返回”,以查看是否有不同的限定词可用。它会找到每一个,然后它会再试一次-所有的名词、等的替代品

总是在描述列表时,考虑使用DCG。使用DCG非终端可以这样编写代码:

determiner --> [a].
determiner --> [every].

noun --> [criminal].
noun --> ['big kahuna burger'].

verb --> [eats].
verb --> [likes].
案例中的“句子”是一个列表,用以下非终结符描述:

sentence --> determiner, noun, verb, determiner, noun.
请注意,DCGs中的
(,)//2
可以理解为“and then”

用该语法描述的句子可以用下列句子列举:

?- phrase(sentence, Ls).
Ls = [a, criminal, eats, a, criminal] ;
Ls = [a, criminal, eats, a, 'big kahuna burger'] ;
Ls = [a, criminal, eats, every, criminal] ;
etc.

按空格键查看进一步的解决方案。

是否尝试运行它?Prolog将查找与数据库匹配的
语句的所有解决方案。