2015-09-28 3 views
3

В this page подробно DCGs в Прологе, он предлагает следующий пример грамматики:Каков второй параметр в этом предикате Prolog? Почему он пуст?

s --> np,vp. 

np --> det,n. 

vp --> v,np. 
vp --> v. 

det --> [the]. 
det --> [a]. 

n --> [woman]. 
n --> [man]. 

v --> [shoots]. 

который может быть использован как таковой:

s([a,woman,shoots,a,man],[]). 

Что такое второй параметр делает? Почему это [] или пусто? Я думаю, вы просто позвоните s([a,woman,shoots,a,man])., но это не сработает.

Может ли кто-нибудь объяснить, что происходит с пустым списком здесь и что он делает?

+2

Как говорится в ссылке, которую вы дали: * То есть, как и в распознавателе разностного списка, мы спрашиваем, можем ли мы получить информацию, употребляя символы в [a, woman, shoots, a, man], * * ничего не оставляя **. Другими словами, DCG ожидает, что второй аргумент «что осталось» после обработки ввода. Поскольку в этом случае вы ничего не хотите, аргумент '[]'. Вы также можете использовать «фразу (s, [a, woman, shoots, a, man])», что является более распространенным способом вызова DCG. И для генерации всех признанных предложений, фраза (s, L) .'. – lurker

+0

Я читал это, но я не понимаю, почему передача второго аргумента обозначается как то, что он ожидает оставить. Где эта логика указана в первом блоке кода? –

+0

Эта логика «под капотом» в DCG. Вот упражнение: запустите интерпретатор Prolog, загрузите пример программы DCG (например, из файла), затем выполните «листинг». Это покажет вам, каковы фактические предикаты, и вы увидите второй аргумент. Если вы используете 'фразу' и только нотацию DCG, этот аргумент неяв. Учебник немного вводит в заблуждение, не вводя предикат 'фраза'. – lurker

ответ

3

Я настоятельно рекомендую всегда использовать интерфейс phrase/2 для доступа к DCG.

Причина в том, что вы не должны полагаться на какой-либо конкретный метод расширения для предложений DCG. Ваша система может расширять DCG так, как указано на этой странице, но использование этого свойства предотвращает многие оптимизации, которые в противном случае были бы возможны.

В вашем случае, вы должны прочитать о значении phrase/2, и использовать его как это:

?- phrase(NT, Ls). 

со значением, что DCG нетерминал NT описывает список Ls.

Таким образом, вы заметили, что вы даже не видите пустой список здесь! Поэтому использование phrase/2 делает использование DCG более легким для новичков, чем мышление с точки зрения дополнительных аргументов.

Если вам действительно нужно получить доступ к оставшейся части списка, что иногда полезно, вы всегда можете использовать phrase/3. Фактически, phrase(NT, Ls) является сокращением для phrase(NT, Ls, []), но вам не нужно беспокоиться об этом так скоро. Это будет естественно для вас, когда у вас будет больше опыта с Prolog.

+0

s (X) для продвижения фразы/2..3', которая позволяет использовать множество удобных коротких форм в 'NT', например:'? - фраза ((«a» | «b»), « 123" ("х" | "у")), Xs) .' – repeat