Пролог предикатного вызова - PullRequest
2 голосов
/ 31 января 2012

В следующем уроке: http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/7_3.html

Есть часть:

test_parser :- repeat,
               write('?? '), 
               read_line(X),
               ( c(F,X,[])   | q(F,X,[])  ),
               nl, write(X), nl, write(F), nl, fail.

Теперь я очень запутан в отношении c (F, X, []) и q(F, X, []) часть, потому что она, кажется, не соответствует ни одной вещи, которую я видел, c берет только один параметр из того, что я могу сказать, и эти параметры, кажется, не имеют смысла для q.Пожалуйста, помогите мне понять, что здесь происходит.

Ответы [ 2 ]

6 голосов
/ 31 января 2012

c // 1 и q // 1 являются точками входа (иначе говоря, производство верхнего уровня) Грамматики Определенных Условий, определенной ниже, где вы найдете

c(F) --> ....
q(F) --> ....

Этот стиль 'вызова' в точке входа DCG не рекомендуется, обычно лучше вызывать фразу (грамматика, TextToAnalyze, TextAfterAnalysis) , в данном случае phrase((c(F) ; q(F)), "some text", "")...

Оператор --> обычно переписывается с добавлением 2 аргументов, которые вызывают у вас беспокойство.

РЕДАКТИРОВАТЬ

Т.е. c(L) --> lead_in,arrange(L),end.

переписываетсядо

c(L,X,Y) :- lead_in(X,X1),arrange(L,X1,X2),end(X2,Y).

2 голосов
/ 01 февраля 2012

c определяется с помощью -->, что фактически добавляет к нему два скрытых аргумента. Первый из них - это список, который нужно проанализировать по правилу грамматики; второе "что осталось" после разбора. c(F,X,[]) вызывает c в списке X, чтобы получить результат F, ожидая, что [] останется, то есть парсер должен использовать весь список X.

...