Проблемы с 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", то есть некоторое количество нулей, за которым следует такое же количество единиц, а затем снова такое же количество нулей.