lambda - Prolog 中的括号抽象

标签 lambda prolog

根据 Antoni Diller 的算法“A”看起来相当简单:

enter image description here

http://www.cantab.net/users/antoni.diller/brackets/intro.html

我们可以在 Prolog 中做到这一点吗?

最佳答案

% associate formulas to left
associate_left(F, A, B) :-
    append(A, [B], F).

% apply algorithm
reduce(b(_, []), []).
reduce(b(A, B), 'K'(B)) :- atom(B), dif(A, B).
reduce(b(A, A), 'I').
reduce(b(A, [F]), R) :- reduce(b(A, F), R). % uncessary paranthesis case
reduce(b(A, F), 'S'(Pr, Qr)) :-
    associate_left(F, P, Q),
    reduce(b(A, P), Pr),
    reduce(b(A, Q), Qr).

我假设绑定(bind)公式是 b(x, F),其中 x 绑定(bind)在 F 中。

?- reduce(b(x, [x]), A).
A = 'I' 

?- reduce(b(x, [y]), A).
A = 'K'(y) 

?- reduce(b(x, [u, v]), A).
A = 'S'('K'(u), 'K'(v)) 

您链接中的示例

?- reduce(b(x, [u, v, [w, z, x], [x, z, y], [z, x, [y, x]]]), A).
A = 'S'('S'('S'('S'('K'(u), 'K'(v)), 'S'('S'('K'(w), 'K'(z)), 'I')), 'S'('S'('I', 'K'(z)), 'K'(y))), 'S'('S'('K'(z), 'I'), 'S'('K'(y), 'I'))) 

我也试过算法B。有点毛但是here是的。

关于lambda - Prolog 中的括号抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65066544/

相关文章:

prolog - 与 (-)/2 运算符的差异列表

module - 'scope:setting(Key, Value)' 和 'setting(scope:Key, Value)' 之间的区别

programming-languages - Prolog是一种无类型语言吗? Prolog 和动态类型语言有什么区别?

c++ - call_once 初始化一个函数

python - python 循环中的 lambda 运算符

lambda - 如何通过 lambda 在本地使用 dynamoDb

prolog - 如何对不同事实中的数字进行求和?

java - 为什么在使用 for-each 时循环变量实际上是最终的?

c# - 使用 Lambda 表达式堆叠 where 条件

prolog - 如何在prolog中描述交换规则?