私はいくつかのプロローグコードで数日間苦労していましたが、その方法を見つけることができませんでした。ここでの方程式とは、私が試したものであるProlog拡張ユークリッドアルゴリズム
a*p + b*s = gcd(a,b)
:私は、拡張ユークリッドアルゴリズムを記述し、値p
とs
を見つけようとしています、私はそれはsが見つかり少し検索した後 `
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.
とp係数は1と0から始まり、それらの第2の値はそれぞれ0と1です。それはsi_finder述語とti_finder述語で行ったパターンで続きます。共通述語はパターンを再帰的に制御しようとしたところです。しかし、共通の述語はすべての呼び出しでfalseを返すようにしています。誰も私がPrologでこのアルゴリズムを実装するのを助けることができます。
ありがとうございます。
[このビデオはアルゴリズムを説明しています](https://www.youtube.com/watch?v = hB34-GSDT3k)が役立ちます。あなたの述語には、あなたが本当に必要とするよりも多くの議論があると思います。 – lurker
ありがとう、私は検索中にこのビデオを見てきましたが、これは私が詰まっている係数を見つけるので、これはバック置換が必要です。私は[link](https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm)に従って自分のコードを実装し始め、その方法で係数を見つけました。 – adropintheocean
あなたは制約を使うことができました。 clpfdライブラリのマニュアルを見てください。 –