Проблемы с DCG (Пролог)

Я пытаюсь разработать это простое задание DCG (Пролог) для моего курса. Проблема заключается в создании DCG. Я уже определил Вселенную Дискурса в моем коде. Но этот вопрос немного вводит меня в заблуждение. Согласно тому, что я прочитал и знаю, используя мои собственные заметки и этот учебник Пролог сейчас! - ССЫЛКА: http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse29

Можно построить DCG с (a^nb^nc^n). Где ab и c - нормальные буквы, а n - число, на которое нужно умножить букву. Однако мой вопрос такой.

"Разработать и внедрить DCG для распознавания (или генерации) языка 0n1n0n".

Может кто-нибудь помочь мне здесь? Что именно хочет вопрос?

Что касается одного из ответов, я попробовал следующий код без удачи.

s --> [].
s(M) --> a(M),b(M),c(M).

a --> [].
a(New) --> [0], a(Cnt),{New is Cnt+1}.

b --> [].
b(New) --> [1], b(Cnt),{New is Cnt+1}.

c --> [].
c(New) --> [0], c(Cnt),{New is Cnt+1}.

count(T, N) --> [0,1,0], count(T, M), {N is M+1}.
count(_, 0) --> [].

2 ответа

Решение

DCG - это подъязык, размещенный в Прологе, тогда легко посчитать вхождения терминала T.

count(T, N) --> [T], count(T, M), {N is M+1}.
count(_, 0) --> [].

?- phrase(count(a, C), [a,a,a]).
C = 3 ;
false.

Конечно, вы должны найти, что это может решить ваш вопрос легко.

РЕДАКТИРОВАТЬ: я пропустил часть поколения. count//2 не будет работать для генерации из-за встроенной арифметики. Используя обозначения преемников, код также может работать как генератор:

count(T, s(N)) --> [T], count(T, N).
count(_, 0) --> [].

Я думаю, что "0n1n0n" означает "0n1n0n", то есть некоторое количество нулей, за которым следует такое же количество единиц, а затем снова такое же количество нулей.

Другие вопросы по тегам