2016-04-08 2 views
0

Я новичок в Прологе, и я не могу думать ни о каких способов решения этой проблемы, в основном у меня есть предложение, например:ПРОЛОГ извлечения слов из строки и поместив их в список

phrase(det(a),np2(adj(large))). 

Из предложения выше, я хочу, чтобы иметь возможность извлечь в этом случае определителя (а) и прилагательного (большой) и поместить их в список, так как это выглядит:

newList[a,large]. 
+0

'newlist ([Det, Adj]): - phrase_ (det (Det), np2 (adj (Adj))).' –

ответ

2

Как вы работаете с фразой структуры деревьев, которые сами представляют собой правила грамматики, которые вы могли бы использовать в 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] ? ;