考虑以下设置:
:- use_module(library(chr)).
:- chr_constraint
a/1,
b/1.
% really there will be many of these, possibly 100s
% some rules about how to replace as with bs, e.g.,
a(1),a(1) <=> b(2).
% a way to decompose, e.g., b(2) <=> b(1), b(1)
a(X) <=> X #> 1, Y #= X-1 | a(Y), a(1).
b(X) <=> X #> 1, Y #= X-1 | b(Y), b(1).
% except I have to write these for all 100+ variables
我知道 prolog 能够进行元编程,并且我相信它可以用来生成x(X)
上面的分解,但我完全不知道该怎么做。我曾经很接近=..
用来拆开并重新组合电话,但后来我不得不在n(a(2))
任何地方写一些东西。理想情况下,我会写n(a)
一次并添加正确的约束规则(断言?):
能够做类似的事情会更有意义
n(X) <=> %... or possibly :-
n(a).
n(b).
% a(X) <=> ... and b(X) <=> ... are added to the "database" of rules
如果它是 lisp,我想我可以编写宏来做到这一点。prolog 应该是和 lisp 一样的谐音,所以理论上是可以实现的。我只是不知道怎么做。
如何按照类似于上述风格的方式编写分解器“宏”?