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。