Меня интересует постепенное разбор последовательности, поскольку термины входят в единицу. Это требует, чтобы я мог определить, какой из правил перезаписи может потреблять текущий вход. Итак, концептуально я ищу что-то вроде следующего.Имейте 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 от вызывающего, что также представляется выполнимым. Тогда у меня будут в основном имена правил, которые соответствуют входу.
Не могли бы вы привести более конкретный пример того, как вы хотите, чтобы это работало, больше, чем просто '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
Следующим, конечно, является вырожденный пример, но в основном для грамматики типа: 'abc1 -> a, b, c.' 'Ab -> a, b.'' abc2 -> ab, c.' I хотите, чтобы функтор 'T ([a, b, c])' возвращался: 'T = abc1'. Но в конечном итоге что-то рекурсивное, как: '[abc1, abc2 (ab)]'. – user1048677
Я слышал, что функторы могут быть представлены в виде списков, но пока не изучали это. Благодаря! Прежде чем я получил ваш комментарий, я начал с более грубого решения с использованием 'current_functor',' findall' и некоторых «возвращайся, которые являются истинными» функторами в теле того правила верхнего уровня, которое я упомянул в вопросе. – user1048677