Как вы работаете с фразой структуры деревьев, которые сами представляют собой правила грамматики, которые вы могли бы использовать в DCG для своей задачи. Сначала подумайте о том, что должен сказать ваш предикат: связь между деревом структуры фразы и списком, который состоит из слов этого дерева. Вы можете назвать его pstree_words/2. Рассмотрим минимальный пример ниже:
pstree_words(Phrase,List) :-
phrase(Phrase,List).
phrase(det(A),np2(NP)) --> % a phrase is
det(A), % a det followed
np2(NP). % by a np2
det(a) --> % a is a determiner
[a]. % hence in the list
np2(adj(A)) --> % a np2 is
adj(A). % an adj
adj(large) --> % large is an adjective
[large]. % hence in the list
Обратите внимание, что первая цель pstree_words/2 не ваша структура фразы, но встроенный предикат фразы/2 для обработки DCGs. Вы уже можете использовать это для запроса слова в фразы структуры дерева:
?- pstree_words(phrase(det(a),np2(adj(large))),L).
L = [a,large]
Если вы хотите добавить слова, которые вы просто нужно добавить согласно правилам. Например, чтобы добавить Определитель «» ты просто добавить:
det(the) -->
[the].
Чтобы добавить новую фразу структуры просто добавить новые правила, фразы // 2. Однако, если вы попытаетесь запросить pstree_words наоборот, то есть спросить, соответствует ли последовательность слов известной структуре фразы, она не работает. Чтобы исправить, что вы можете изменить определение pstree_words/2:
pstree_words(Phrase,List) :-
is_phrase(Phrase),
phrase(Phrase,List).
is_phrase(phrase(_,_)).
Факт is_phrase/1 просто ограничивает Phrase
к двуместной структуре. Если вы добавите правила грамматики, чтобы соответствовать, например, 3-х позиционные структуры для фразы вы также добавляете согласно фактам для is_phrase/1: is_phrase(phrase(_,_,_))
. С этими изменениями предикат теперь работает в другом направлении тоже:
?- pstree_words(PST,[a,large]).
PST = phrase(det(a),np2(adj(large)))
Другие интересные возможности использований: какие фразы со словами [D,large]
есть?
?- pstree_words(PST,[D,large]).
D = a,
PST = phrase(det(a),np2(adj(large))) ? ;
D = the,
PST = phrase(det(the),np2(adj(large)))
Какие фраз данной структуры есть?
?- pstree_words(phrase(det(D),np2(adj(A))),L).
A = large,
D = a,
L = [a,large] ? ;
A = large,
D = the,
L = [the,large] ? ;
'newlist ([Det, Adj]): - phrase_ (det (Det), np2 (adj (Adj))).' –