我有一个程序,结果是一个术语equal(add(num(2),var(x)),num(3))
。基本上该术语是从语句2 + x = 3转换。我希望将该术语解析为CLP术语,因此我可以得到x = 1
之类的结果。
如何将变量赋值给term var,这样如果术语中还有另一个x,它就可以绑定到同一个变量,例如equal(add(num(2),var(x)),add(num(3),var(x),var(y))
,它与2 + x = 3 + x + y相同
我希望答案是y = -1
答案 0 :(得分:0)
不确定这正是你想要的,无论如何get_var / 2对你有用。
apply_fdx(X, KV) :-
setof(K, get_var(X, K), Ks),
pairs_keys_values(KV, Ks, Vs),
Vs ins -100 .. 100,
make_fdx(X, KV, FDx),
FDx,
label(Vs).
get_var(X, K) :- X =.. [var,K].
get_var(X, K) :- X =.. [_|As], member(E, As), get_var(E, K).
make_fdx(equal(L,R), KV, Lf #= Rf) :-
make_fdx(L, KV, Lf), make_fdx(R, KV, Rf).
make_fdx(add(A, B), KV, Af + Bf) :-
make_fdx(A, KV, Af),
make_fdx(B, KV, Bf).
make_fdx(add(A, B, C), KV, Af + Bf + Cf) :-
make_fdx(A, KV, Af),
make_fdx(B, KV, Bf),
make_fdx(C, KV, Cf).
make_fdx(var(K), KV, V) :- memberchk(K-V, KV).
make_fdx(num(N), _, N).
产量
?- apply_fdx(equal(add(num(2),var(x)),add(num(3),var(x),var(y))), Vs).
Vs = [x- -100, y- -1] ;
Vs = [x- -99, y- -1] .
等等。
如果你可以从规范化的语法树开始(即添加2个参数而不是3个),make_fdx / 3可以变得更简单。