2013-12-10 3 views
0

При анализе списка строк текущие правила позволяют запятой находиться в конце предложения и не позволяют запятой быть между словами, что, очевидно, неверно. Как изменить текущие правила?Как изменить правила анализа объявлений в Prolog?

complexsentence --> [] ; simplesentence, complexsentence; 
        simplesentence, delimiter, complexsentence. 
simplesentence --> noun, verb. 
delimiter --> [,]. 
noun --> [sun]. 
verb --> [shines]. 
% TEST: phrase(complexsentence, [sun,shines]). %must be TRUE 
% TEST: phrase(complexsentence, [sun,',',shines]). %must be TRUE 
% TEST: phrase(complexsentence, [sun,shines,',']). %must be FALSE 

Update: Пытался решить, как это. Он работает

complexsentence --> [] ; simplesentence,complexsentence. 
simplesentence --> noun,verb; 
      noun,verb,delimiter,noun; 
      noun,verb,delimiter,noun,verb. 
delimiter -->[,]. 
noun-->[sun]. 
verb-->[shines]. 
% TEST: phrase(complexsentence, [sun,shines]). % TRUE 
% TEST: phrase(complexsentence, [sun,',',shines]). % FALSE 
% TEST: phrase(complexsentence, [sun,shines,',']). %FALSE 
+0

Почему это второй случай «должен быть ИСТИННЫМ»? И почему «[]« действительный «complexsentence»? – lurker

+0

Ему нужно, чтобы получить решения, но было бы более интуитивным (я думаю) сказать «простоту» вместо '[ ] '. –

+0

@ DanielLyons да, это то, о чем я думал, «complexsentence -> simplesentence.' имел бы больше смысла, чем« complexsentence »-> [] .' – lurker

ответ

3

Предлагаемое изменение в ВСО:

complexsentence --> simplesentence. %was [] 
complexsentence --> simplesentence, complexsentence. 
complexsentence --> simplesentence, delimiter, complexsentence. 
simplesentence --> noun, verb. 
delimiter --> [,]. 
noun --> [sun]. 
verb --> [shines]. 

Тогда:

% TEST: phrase(complexsentence, [sun,shines]). %will be TRUE 
% TEST: phrase(complexsentence, [sun,',',shines]). %will be FALSE (as it should) 
% TEST: phrase(complexsentence, [sun,shines,sun,shines]). %will be TRUE 
% TEST: phrase(complexsentence, [sun,shines,',',sun,shines]). %will be TRUE 
% TEST: phrase(complexsentence, [sun,shines,',']). %will be FALSE 

Я предлагаю второй тест должен быть FALSE, так как описание проблемы показывает, ... и не разрешать запятую между словами.

Хотя первоначальный пункт (complexsentence --> [].) при условии случая терминации для рекурсивного определения complexsentence, она имела две проблем: (1) он определил пустое предложение в качестве простейшего сложного предложения, и (2) это позволило косой разделитель на действительном комплексном предложении (через 3-е предложение, так как вы можете получить simplesentence, delimiter, []. Использование complexsentence --> simplesentence. в качестве базового варианта делает более логичным смысл и исправляет вторую проблему в качестве бонуса, так как ваши другие случаи являются логичными в этом контексте.

+0

Он также работает. Почему ваше решение лучше, чем мое?) –

+1

@RCola Я попытался дать некоторое объяснение в моем отредактированном ответе, который, я надеюсь, будет полезен. – lurker

Смежные вопросы