在Prolog中转换变量

时间:2013-12-14 13:06:35

标签: prolog clpfd

我有一个程序,结果是一个术语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

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可以变得更简单。