2016-02-17 7 views
0

Меня интересует постепенное разбор последовательности, поскольку термины входят в единицу. Это требует, чтобы я мог определить, какой из правил перезаписи может потреблять текущий вход. Итак, концептуально я ищу что-то вроде следующего.Имейте Prolog, возвращающее правило, которое применяется

Для грамматики:

abc1 --> [a, b, c]. 
ab --> [a, b]. 
abc2 --> ab, [c]. 

Подобным же образом, что мы указываем аргументы, которые удовлетворяют цели, как переменные, я хотел бы указать сам функтор в качестве переменной, например, T.

В частности, я хочу функтор T([a,b,c]) вернуться: T = abc1. Но в конце концов что-то рекурсивное как: [abc1, abc2(ab)]

Я думал создать правило верхнего уровня, который бы в его теле перечислить все правила голов грамматики и, возможно, каким-то образом вернуть деревья T, которые могут быть построены по тем правилам, которые соответствуют вводу, но это перечисление кажется глупым, поскольку Prolog перечисляет заголовки правил под капотом в любом случае, и я все еще не уверен, смогу ли я сделать это решение.

Кроме этого, я думал о пакете лямбда для пролога, но, взглянув на него, кажется, не достигает того, что мне нужно.

Update:

я указал в направлении, представляющий функтор как список, например, с помощью =../2, но казалось, что такое решение требует, чтобы я явно экземпляр T функтора называться как список. Принимая во внимание, что для меня важно, чтобы пролог нашел этот функтор, пытаясь объединить переменную T с доступными правилами, пока некоторые из них не разрешат true с аргументами [a, b, c], [], которые я поставил.

Другими словами, мне нужно, чтобы call(T, [a, b, c],[]). работал, но он говорит, что T недостаточно инстанцируется.

Update 2:

Решение я в настоящее время происходит с, чтобы запросить все доступные функторы через current_functor, чтобы увидеть, какие из них удовлетворены входом [a, b, c], []. Как только у меня их есть, мне просто нужно, чтобы они самоопределялись, например, передавая свое имя до arg от вызывающего, что также представляется выполнимым. Тогда у меня будут в основном имена правил, которые соответствуют входу.

+4

Не могли бы вы привести более конкретный пример того, как вы хотите, чтобы это работало, больше, чем просто 'T ([a, b, c])'? Вернее, как выглядит более конкретный запрос? Вы также знакомы с предикатом '= ../2'? 's (A, B, C) = .. [s, A, B, C]', и вы можете запросить 's (A, B, C)' с 'T = s, call (T, A, B , C). Как было сказано, это выглядит так: 's (T, [it, sleeps], []), T = .. [X | _].' Решит вашу проблему (результат «X»). – lurker

+0

Следующим, конечно, является вырожденный пример, но в основном для грамматики типа: 'abc1 -> a, b, c.' 'Ab -> a, b.'' abc2 -> ab, c.' I хотите, чтобы функтор 'T ([a, b, c])' возвращался: 'T = abc1'. Но в конечном итоге что-то рекурсивное, как: '[abc1, abc2 (ab)]'. – user1048677

+0

Я слышал, что функторы могут быть представлены в виде списков, но пока не изучали это. Благодаря! Прежде чем я получил ваш комментарий, я начал с более грубого решения с использованием 'current_functor',' findall' и некоторых «возвращайся, которые являются истинными» функторами в теле того правила верхнего уровня, которое я упомянул в вопросе. – user1048677

ответ

0

я в конечном итоге явно перечисляя все самоидентифицирующие правила глав моей грамматики в одном правиле верхнего уровня:

parse(RuleSubtree, Input, []). 

где

parse(T) --> 
    rule1(T); 
    rule2(T); 

...

ruleN(T). 

и каждое правило самоидентифицируется следующим

ruleN(ruleN(SubRule1, SubRule2, ... SubRuleN)) --> 
    ruleX(SubRule1), ruleY(SubRule2), ... ruleZ(SubRuleN). 

, который дает мне структуру правил, который соответствовал вход, в переменной T.

Может быть, немного жестко запрограммирован, но он работает для моей цели и позволяет мне продвигаться с моим экспериментом, к которому есть более серьезные проблемы на пути.

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

  • Нет связанных вопросов^_^