Prolog中的Convert变量

Prolog中的Convert变量,prolog,clpfd,Prolog,Clpfd,我有一个程序,它的结果是一个项相等(add(num(2),var(x)),num(3))。基本上,这个术语是从语句2+x=3转换而来的。我希望将该术语解析为CLP术语,以便得到类似x=1的结果 如何将变量分配给术语var,这样,如果术语中有另一个x,它可以绑定到同一个变量,例如,equal(add(num(2),var(x)),add(num(3),var(x),var(y))与2+x=3+x+y相同 我希望答案是y=-1不确定这正是您想要的,无论如何,get\u var/2可能对您有用 app

我有一个程序,它的结果是一个项
相等(add(num(2),var(x)),num(3))
。基本上,这个术语是从语句2+x=3转换而来的。我希望将该术语解析为CLP术语,以便得到类似
x=1
的结果

如何将变量分配给术语var,这样,如果术语中有另一个x,它可以绑定到同一个变量,例如,
equal(add(num(2),var(x)),add(num(3),var(x),var(y))
与2+x=3+x+y相同
我希望答案是y=-1

不确定这正是您想要的,无论如何,get\u 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可以变得更简单。

很大程度上取决于你如何处理
equal
,但是你的方法应该可以很好地工作。如果你有
var(x)
并且是一致的,那么这没有什么错。因此,`add(a,B)=add(num(2),var(x)),add(C,D,E)=add(num(3),var(x),var(y)),D=B.`将是真的。您可以通过删除所有setof和getvar内容以及
Vs-ins…
行来简化此操作,在label/1之前移动成对的键\u值/3,并将倒数第二个子句更改为
make_fdx(var(K),KV,V):-memberchk(K-V,KV),V-ins-100..100。