2014-01-04 3 views
0

Вот крошечный лексикон и миниграмм, состоящий из одного синтаксического правила, I должны перечислять все предложения, которые эта грамматика может сгенерировать в порядке , что 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). 
+1

Вы попробовали запустить его? Prolog будет искать все решения для 'предложения', которые соответствуют базе данных. – lurker

ответ

1

Пролог имеет реляционную модель данных и использует запятую для обозначения AND. Существует 2 варианта для каждого типа слов, тогда для каждого слова будет два решения.

Следующая фраза генерироваться будешь использовать первый вариант доступного, и так как модель исполнения глубины первый поиска, такая альтернатива будет следующим существительным после уголовного.

Теперь, поскольку Prolog исчерпал альтернативы для последнего слова, он «вернется», чтобы узнать, доступен ли другой определитель. Он найдет каждый, то он будет пытаться - еще раз - все альтернативы для существительного, и т.д. и т.п.

1

Как всегда при описании списков, рассмотреть возможность использования DCG. Ваш код может быть написан как это с DCG нетерминалами:

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

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

verb --> [eats]. 
verb --> [likes]. 

«приговор» в вашем случае является список, который описывается следующим нетерминалом:

sentence --> determiner, noun, verb, determiner, noun. 

Обратите внимание, что (,)//2 в DCGs может быть читать как «и затем».

Приговоры, которые описаны в этой грамматике, то можно перечислить с:

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

где вы нажмите пробел, чтобы увидеть дальнейшие решения.