我一直在努力与几个prolog代码几天,我找不到出路。我想写的扩展欧几里德算法,并找到值p
和s
:序言扩展欧几里德算法
a*p + b*s = gcd(a,b)
方程,这里是我曾尝试:`
common(X,X,X,_,_,_,_,_,_).
common(0,Y,Y,_,_,_,_,_,_).
common(X,0,X,_,_,_,_,_,_).
common(X,Y,_,1,0,L1,L2,SF,TF):-
append(L1,1,[H]),
append(L2,0,[A]),
SF is H ,
TF is A,
common(X,Y,_,0,1,[H],[A],SF,TF).
common(X,Y,_,0,1,L1,L2,SF,TF):-
append(L1,0,[_,S2]),
append(L2,1,[_,T2]),
Q is truncate(X/Y),
S is 1-Q*0,T is 0-Q*1 ,
common(X,Y,_,S,T,[S2,S],
[T2,T],SF,TF).
common(X,Y,N,S,T,[S1,S2],[T1,T2],SF,TF):-
Q is truncate(X/Y),
K is X-(Y*Q),
si_finder(S1,S2,Q,SF),
ti_finder(T1,T2,Q,TF),
common(Y,K,N,S,T,[S2,S],[T2,T],SF,TF).
si_finder(PP,P,Q,C):- C is PP - Q*P.
ti_finder(P2,P1,QA,C2):- C2 is P2 - QA*P1.
后有点搜索,我发现S和p系数从1和0开始,第二个值分别为0和1.然后它继续一个模式,这是我在si_finder和ti_finder谓词中完成的。常用谓词是我试图递归控制模式的地方。然而,通用谓词在每次调用中都会返回false。任何人都可以帮助我在Prolog中实现这个算法。
在此先感谢。
您可能会发现[视频解释算法(https://www.youtube.com/watch?v = hB34-GSDT3k)有帮助。我认为你的谓词比你真正需要的参数多得多。 – lurker
谢谢,我在搜索过程中观看过这段视频,但这需要返回替换,因为我正在查找卡住的系数。我以这种方式 – adropintheocean
你可以使用约束开始根据执行我的代码[链接](https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm),找到系数。查看库clpfd的手册。 –