Обратное применение лямбда-выражения, 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).
до свидания