問題タブ [successor-arithmetics]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - 別の解決策を求めるときに Prolog が無限ループになる
私は SWI Prolog を使用しています。次のコードが宿題で使用されています (コードは宿題ではありませんが、コースで必要なメソッドを記述するために必要です)。
exp(a,b,c)
を意味しc=b^a
ます。
これは、「The Art of Prolog: Advanced Programming Techniques」という本から直接コピーしたものです。
次のクエリを実行すると:
私は答えを得ます:
しかし、入力して別の答えを求めると;
無限ループ (スタック不足エラーで終了) が発生します。false になると予想していました。
コードの問題は何ですか?(自然数の同じ表現で) 同じことをするが、私が説明したように動作するコードはありますか? もしそうなら、いくつかの指針や提案が大いに役立つでしょう。
前もって感謝します。
prolog - 別の方法で 2 つの整数を除算する
n=s(s(...s(0)...)) (単に n= s^n(0)) と考えてみましょう。2 つの整数の除算を計算するプログラムをどのように作成できますか? つまり、 s^(n//m) (除算の定義) です。何か案は?たとえば、次のような質問があるとします。
私は次のコードを書きました:
prolog - プロローグのディビジョン 2 ナチュラル
私は次のコードを書きました:
すべてはここまでです。しかし、他の 2 つの自然数の除算を計算するには、何を書けばよいでしょうか? 例えば
prolog - プロローグ、ペアノ算術で割り切れるかどうかをチェック
最初の項 (たとえばs(s(nul))
(または 2)) が 2 番目の項 (たとえばs(nul)
(または 1)) で割り切れるかどうかを確認する必要があります。
私がやりたいのは、与えられた項を2倍してから、その項が他の項より小さいか等しいかどうかを確認することです(等しい場合-問題は解決されます)。
これまでのところ、私はこれを得ました:
項に 2 を掛ける方法がわかりません。何かアイデアはありますか?
prolog - 自然数 (1) -> false。s/1 述語の問題
私はswi-prologを使用しています。本「プロローグの芸術」の例に従おうとしているだけですが、正しい結果が得られません。これは s/1 述語が原因である可能性があります。swipl のドキュメントで s/1 を見つけることさえできません。類似した唯一の述語は succ/2 です: http://www.swi-prolog.org/pldoc/man?predicate=succ/2 This can' t は s/1 と同じように使用できます。私はs述語を持っている方がずっと好きです。
これは、数値が自然数かどうかを判断するためのプログラムです。
ただし、たとえば natural_number(1) は false になります。ここで何が問題なのですか?
prolog - Prolog - いくつかの基本的な算術演算の実装
私は Prolog を初めて使用し、組み込みの述語を使用せずに、自然数に対していくつかの基本的な算術演算を実装する必要があります。
I は単項表記で自然数 Term を表します。つまり、I は定数 0 と、再帰的な後継ファンクターs [つまり、4 = s(s(s(s(0))))] を持ちます。上記の表記に関して、算術演算を実装します。
一連のルールは次のとおりです。
今、クエリすると:
私はすべてOKです:
RES = s(s(s(s(s(s(0))))))。
クエリを実行すると: (6/3=? と尋ねたい)
無限ループに陥って SO になる
mult 述語で再帰呼び出しの順序を変更しても、役に立ちません。
Linux マシンで swi-prolog を実行しています。
アドバイスをいただければ幸いです。
prolog - 2 つ以上の入力に追加で後継関数を使用するにはどうすればよいですか?
ここに 2 つの入力の加算コードがあります (X+1 と Y の合計が Z+1 の場合に Z に結果が必要なように)。
しかし、次のような3つのコンポーネントに同様のコードを使用できるのだろうか
前もって感謝します。
prolog - 後継演算による電力 - 無限ループを防ぐ方法は? 【プロローグ】
私は一日中これについて考えてきました。最後に認めますが、私は Prolog を思ったほどよく理解していません。
一日の初めに、2 つの s-Number を乗算する後継演算の実装に問題がありました。その構造は次のとおりです。
私の最初の試みはこれでした:
これは機能しましたが、クエリmul(X,Y,s(0))
は無限ループで終了しました。なんで?次の投稿を読みました: Prolog successor notation yields incomplete result and infinite loop
そこからわかったこと: add を呼び出す前に mul を呼び出し、両方の mul/3 呼び出しで使用されていない変数が mul/3 述語にある場合、Prolog はバインドされなかった変数の新しい可能性を見つけようとします。したがって、無限ループに陥ります。
この問題を解決するために、最初に add を呼び出しました。
それでできました。それからべき乗関数を実装しようとしましたが、「まあ、今は簡単です。最初に試すのは次のようになります。
しかし、R と Tmp の左再帰を防ぐために、最初に mul を配置する必要があります。
簡単!」 男の子、私はとても間違っていました. mul を前に置いたとしても、無限ループに陥らずに実装する方法がわかりません.
どんなアドバイスでも大歓迎です。あなたは私の土曜日の仕事の労力を節約し、私の自尊心を高めることができます! 前もって感謝します。
編集:不足している合計述語を追加しました:
prolog - 後継演算プロローグ Mod 関数
プロローグで後継演算(ペアノ数) のmod/3関数を記述する方法は?