2016-11-18 2 views
1

Что было бы лучшим способом определить фразу, которая может описать наречие одним из двух способов?Определенная классовая грамматика в Prolog - Or statement

Не могли бы вы просто сказать:

  1. adverb_phrase (N, нареч (N, Adv)) -> Путь 1.
  2. adverb_phrase (N, нареч (N, Adv)) -> Путь 2.

Я пробовал это сделать, но я получаю переменные (например, _G12345) на выходе, что выглядит неправильно.

ответ

2

Да, что вы показать, безусловно, действует способ государственных альтернатив в   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!

+1

Спасибо за разработку этого для меня! – Dazzler95