анализ и создание многоуровневых структур списков с помощью DCG - PullRequest
2 голосов
/ 08 апреля 2020

Это вопрос Prolog DCG.

Предположим, я называю "a-list" список из нуля или более "a" s:

% as = [a,a,a]
as --> [].
as --> [a], as.

Предположим, я хочу представить "b-list", список из нуля или более a-списков:

% bs := [ as,      as  ]
% bs  = [ [a,a,a], [a] ]
bs --> [].
bs --> [A], { phrase(as,A) }, bs.

Есть ли еще какой-то идиоматический c способ сказать это, который не требует использования фигурных скобок для удаления из DCG в "нормальный пролог", только чтобы снова вызвать фразу ()?

1 Ответ

2 голосов
/ 08 апреля 2020

Альтернатива , которую я не считаю лучше, поскольку она, возможно, менее читабельна , - это использование лямбда-выражения для определения нетипичного термина bs//0. Используя Logtalk (который можно запустить с большинством систем Prolog) или SWI-Prolog (через library(yall), который реализует лямбда-выражения Logtalk):

bs --> [].
bs --> [[A|As],As]>>phrase(as,A), bs.

Лямбда-выражение обеспечивает доступ к неявным аргументам правила грамматики.

Примеры звонков:

?- phrase(bs, [[a],[a,a,a],[a,a]]).
true.

?- phrase(bs, [[a],[a,b,a],[a,a]]).
false.
...