PrologでGcdを見つけるためのプログラム

オハッド

(モジュロを使用せずに)GCDを見つけるためのコードをPrologで書き込もうとしましたが、このプログラムの何が問題になっているのか誰か教えてもらえますか?

gcd(X,Y,Z):- X>=Y, X1=X-Y, gcd(X1,Y,Z).
gcd(X,Y,Z):- X<Y, X1=Y- X, gcd(X1,X,Z).
gcd(0,X,X):- X>0.
潜んでいる

元の実装が機能しない理由については、2つの理由があります。

述語=/2は、算術割り当てではなく、統合用です。

X1 = X - Y、結果を減算YXて結果をに格納しませんX1むしろ、それX1は用語、と統合-(X,Y)ます。もし、例えば、X=5そしてY=3、その結果は、なりX1=5-3ません、X1=2解決策は、is/2評価された算術式を割り当てるを使用することですX1 is X - Y

ベースケース述語以外の他の述語は、ベースケースと正常に一致します

この句gcd(0,X,X) :- X > 0.は妥当な基本ケースですが、2番目の句(gcd(X,Y,Z):- X<Y,...)が常に最初に同じ条件に正常に一致し、無限再帰とスタックオーバーフローが発生するため、試行されることはありません

これを修正する1つの方法は、ベースケースを最初の句に移動し、正常に実行された後のバックトラックを回避するためにカットを使用することです。

gcd(0, X, X):- X > 0, !.
gcd(X, Y, Z):- X >= Y, X1 is X-Y, gcd(X1,Y,Z).
gcd(X, Y, Z):- X < Y, X1 is Y-X, gcd(X1,X,Z).

これは今動作します:

| ?- gcd(10,6,X).

X = 2 ? ;

(1 ms) no
| ?- gcd(10,5,X).

X = 5 ? ;

no

(注:ここでの「いいえ」は、最初の解決策を見つけた後、それ以上解決策が見つからないことを意味します)


補遺

上記の実装には、まだいくつかの「ギャップ」が残っています。1つは、gcd(0, 0, R)正常に処理されない(オーバーフローする)ことです。第二に、それは負の値を処理しません。考えられる解決策の1つは、次のケースを詳しく説明することです。

gcd(X, Y, Z) :-
    X < 0, !,
    gcd(-X, Y, Z).
gcd(X, Y, Z) :-
    Y < 0, !,
    gcd(X, -Y, Z).
gcd(X, 0, X) :- X > 0.
gcd(0, Y, Y) :- Y > 0.
gcd(X, Y, Z) :-
    X > Y, Y > 0,
    X1 is X - Y,
    gcd(Y, X1, Z).
gcd(X, Y, Z) :-
    X =< Y, X > 0,
    Y1 is Y - X,
    gcd(X, Y1, Z).

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Prologプログラムですべての自然数解を見つける

分類Dev

2つの配列で共通の要素を見つけるためのJavascriptプログラム

分類Dev

最大の素数を見つけるためのTSQLプログラム

分類Dev

forループでユーザー定義の平均を見つけるためのCのプログラム

分類Dev

hcfとlcmを見つけるためのPythonプログラム

分類Dev

Javaプログラムの時間計算量を見つけるためのプログラム

分類Dev

インバーバルで増加する数を見つけるためのCプログラム

分類Dev

子プロセスが配列の合計を見つけるためのCプログラム

分類Dev

毎月のプログラムで日を見つける

分類Dev

目標を証明できるようにするために欠落している述語を見つけるためのプログラム

分類Dev

ドライバーを見つけるために使用できるプログラムはありますか?

分類Dev

Prolog-特定の値に合計される値のグループを見つけるプログラム

分類Dev

特定のプログラムを見つけるためのLinuxコマンドラインツール

分類Dev

これは、アームストロング数を見つけるための私のプログラムです。

分類Dev

プロローグ:グラフでパスを見つけるための句の順序

分類Dev

C ++で階乗を見つけるためのこの再帰プログラムの背後にあるロジックは何ですか?

分類Dev

回文文字列を見つけるためのLexおよびyaccプログラム

分類Dev

数字の束の中で最大のものを見つけるためのRubyプログラム(ユーザーが指定した入力)

分類Dev

辞書ファイル内の2つの単語の距離を見つけるためにJavaプログラムに取り組んでいます

分類Dev

DISPLAYが設定されていないときに、プログラムでDISPLAYの現在の値を見つける方法は?(crontabで使用するため)

分類Dev

プログラムでAndroidのドット抜けを見つける方法

分類Dev

2つの数の積を見つけるプログラム

分類Dev

最大の素数を見つけるための私のプログラムがコンソールに書き込まないのはなぜですか?

分類Dev

特定のファイルを作成したプログラムを見つける

分類Dev

Cプログラムでヒープの破損を見つける

分類Dev

与えられた範囲の回文数を見つけるJavaプログラム

分類Dev

マシン上のコアの数をプログラムで見つける

分類Dev

プログラムでRの現在のバージョンを見つける

分類Dev

C++ でテンプレート メタプログラミングを使用して、2 つの整数の GCD を見つける

Related 関連記事

  1. 1

    Prologプログラムですべての自然数解を見つける

  2. 2

    2つの配列で共通の要素を見つけるためのJavascriptプログラム

  3. 3

    最大の素数を見つけるためのTSQLプログラム

  4. 4

    forループでユーザー定義の平均を見つけるためのCのプログラム

  5. 5

    hcfとlcmを見つけるためのPythonプログラム

  6. 6

    Javaプログラムの時間計算量を見つけるためのプログラム

  7. 7

    インバーバルで増加する数を見つけるためのCプログラム

  8. 8

    子プロセスが配列の合計を見つけるためのCプログラム

  9. 9

    毎月のプログラムで日を見つける

  10. 10

    目標を証明できるようにするために欠落している述語を見つけるためのプログラム

  11. 11

    ドライバーを見つけるために使用できるプログラムはありますか?

  12. 12

    Prolog-特定の値に合計される値のグループを見つけるプログラム

  13. 13

    特定のプログラムを見つけるためのLinuxコマンドラインツール

  14. 14

    これは、アームストロング数を見つけるための私のプログラムです。

  15. 15

    プロローグ:グラフでパスを見つけるための句の順序

  16. 16

    C ++で階乗を見つけるためのこの再帰プログラムの背後にあるロジックは何ですか?

  17. 17

    回文文字列を見つけるためのLexおよびyaccプログラム

  18. 18

    数字の束の中で最大のものを見つけるためのRubyプログラム(ユーザーが指定した入力)

  19. 19

    辞書ファイル内の2つの単語の距離を見つけるためにJavaプログラムに取り組んでいます

  20. 20

    DISPLAYが設定されていないときに、プログラムでDISPLAYの現在の値を見つける方法は?(crontabで使用するため)

  21. 21

    プログラムでAndroidのドット抜けを見つける方法

  22. 22

    2つの数の積を見つけるプログラム

  23. 23

    最大の素数を見つけるための私のプログラムがコンソールに書き込まないのはなぜですか?

  24. 24

    特定のファイルを作成したプログラムを見つける

  25. 25

    Cプログラムでヒープの破損を見つける

  26. 26

    与えられた範囲の回文数を見つけるJavaプログラム

  27. 27

    マシン上のコアの数をプログラムで見つける

  28. 28

    プログラムでRの現在のバージョンを見つける

  29. 29

    C++ でテンプレート メタプログラミングを使用して、2 つの整数の GCD を見つける

ホットタグ

アーカイブ