Обратное применение лямбда-выражения, eta+ альфа-преобразование в Прологе?

Есть несколько интересных проблем с совместной маршрутизацией. Например, мы хотим вернуть недостигнутые замороженные цели. Но есть проблема для систем Prolog, которые не поддерживают циклические термины. А именно замораживание:

 ?- freeze(V, p(...V...)).

приводит к циклу во внутренней структуре данных. Простым обходным путем было бы карри замерзшей цели. Таким образом, вместо работы с предикатом freeze/2мы будем работать с предикатом guard/2, который можно определить следующим образом:

 guard(V, C) :- freeze(V, call(C, V)).

Но как мы могли определить freeze/2 с точки зрения guard/2? Очевидное определение не работает, так как оно не вводит новую переменную, и у нас все еще есть проблема, заключающаяся в том, что замыкание содержит V (предполагая, что (\)/2 это лямбда-абстракция):

 freeze(V, G) :- guard(V, V\G).

до свидания

0 ответов

Другие вопросы по тегам