Да, что вы показать, безусловно, действует способ государственных альтернатив в DCGs.
Есть и другие варианты. Вот некоторые из них:
1. Ваша версия
Это ваша версия, распространяется только на несколько более полный пример:
adverb_phrase(N, adv(N,Adv)) -->adv1(Adv).
adverb_phrase(N, adv(N,Adv)) -->adv2(Adv).
adv1(likely) --> [].
adv2(happily) --> [].
Пример запрос и ответ:
?- phrase(adverb_phrase(N,A), Ls).
A = adv(N, likely),
Ls = [] ;
A = adv(N, happily),
Ls = [].
Два решения находятся на обратной стороне. Переменная N
также встречается в запросе. Я не знаю, почему вы ввели , и если вам это не нужно, вы можете просто опустить .
2. Более компактный
Используя различные правила для обозначения альтернативы прямо вперед. Обратите внимание, что вы можете рефакторинг код, чтобы сделать его более компактным :
adverb_phrase(N, adv(N,Adv)) -->adv(Adv).
adv(likely) --> [].
adv(happily) --> [].
В этом случае, я просто использовал то же нетерминал для обозначения альтернативы.
3. Использование ('|')//2
Обратите внимание, что существуют также и другие способы для обозначения альтернатив. Изящным способом является использование ('|')//2
, аналогично тому, как альтернативы часто указываются в других формализмах.
Например, вы можете написать свой первоначальный пример, как:
adverb_phrase(N, adv(N,Adv)) -->adv1(Adv) | adv2(Adv).
adv1(likely) --> [].
adv2(happily) --> [].
Вместо ('|')//2
, вы можете также использовать (;)//2
, если вы хотите, по аналогии с обычным Прологом.
Показанные варианты дают точно такие же ответы. Выбранная версия зависит от нескольких факторов, например: используете ли вы DCDCG больше в «грамматике» или более в смысле «монады».
Для вашего конкретного случая, версия 2 кажется подходящей для первого впечатления.
Обратите внимание, что ни один из этих вариантов не является «заявлением ». Мы называем это nonterminals!
Спасибо за разработку этого для меня! – Dazzler95