【问题标题】:which sentences can this grammar generate?这个语法可以生成哪些句子?
【发布时间】:2014-01-06 21:57:29
【问题描述】:

这是一个很小的词典和一个由一个句法规则组成的小语法,我 必须按顺序列出这个语法可以生成的所有句子 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).

【问题讨论】:

  • 你试过运行它吗? Prolog 将寻找与数据库匹配的sentence 的所有解决方案。

标签: prolog grammar dcg


【解决方案1】:

Prolog 有一个关系数据模型,并使用逗号表示 AND。 每个词种有2个选择,那么每个词出现都有2个解决方案。

生成的下一个短语将使用第一个可用的替代方案,并且由于执行模型是深度优先搜索,因此这种替代方案将是criminal之后的下一个名词 .

现在,由于 Prolog 用尽了最后一个单词的替代方案,它会“返回”,看看是否有不同的 determiner 可用。它会找到每个,然后它会再次尝试名词等的所有替代项

【讨论】:

    【解决方案2】:

    在描述列表时,请考虑使用 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.
    

    按空格键查看更多解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 2011-02-04
      • 2012-01-18
      • 2017-05-07
      • 1970-01-01
      相关资源
      最近更新 更多