問題タブ [clpfd]
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での可逆的な数値計算
SICPを読んでいるときに、論理プログラミングの第4.4章に出くわしました。それから私はPrologプログラミング言語を調べ始め、Prologのいくつかの簡単な割り当てを理解しようとしました。Prologは数値計算に問題があるようだとわかりました。
標準のPrologでの階乗の計算は次のとおりです。
私が見つけた問題は、2つの補助変数(C
およびD
)、新しい構文(is
)を導入する必要があること、および問題が元に戻せないことです(つまり、f(5,X)
期待どおりに機能しますが、f(X,120)
機能しません)。
素朴に、私は少なくともC is A-1, f(C, D)
上記がに置き換えられるかもしれないと期待していますf(A-1,D)
が、それでも機能しません。
私の質問は、数値計算ではこの余分な「作業」を行う必要があるのに、他のクエリでは行う必要がないのはなぜですか。
私は、一般的に「何をすべきか」に関する情報は「それをどのように行うか」という質問に答えるには不十分であることを理解しています(そしてSICPはそれについて非常に明確です)。したがって、(少なくともいくつかの)数学の問題に関する宣言的知識は、これらの問題を実際に解決するには不十分です。しかし、それは次の疑問を投げかけます:Prologのこの余分な「もの」は、「何をすべきか」が「それをどのように行うか」に答えるのに十分である問題だけに定式化を制限するのにどのように役立ちますか?
prolog - Prolog Beginner: 算術比較演算子で統一する方法またはセット var を値の範囲に取得する方法
私はプロローグが初めてです。0 ~ 9 の数値を他の 0 ~ 9 の数値に加算し、0 ~ 18 の解を生成する整数加算器を作成する必要があります。これは私がやりたいことです:
私はこのようにそれを呼び出すことができるようにしたいと思います:
有効な追加かどうかを確認するには:
1 つの変数が欠落している場合:
複数の変数が欠落している場合:
これはおそらく非常に単純な質問であり、おそらく非常に簡単なことだと思います。ただし、Prologチュートリアルによると、私は使用しています:
「統一とは異なり、算術比較演算子演算子は変数に値を与えるために使用できません。両側のすべての項がインスタンス化された場合にのみ評価できます。」
prolog - Prolog Beginner: 述語内の各変数に固有の値を作成する方法
プロローグ述語があります:
変数を2回指定した場合を 除いAddUnique
て、リスト内のすべてに対して一意の値を返すように実装したいと思います。
論理的に同等のものは次のとおりです。
?- AddUnique([A, B, C], 10).
次と同等です。?- Add([A, B, C], 10), A != B, B != C, A != C.
と:
?- AddUnique([A, B, B], 10).
次と同等です。?- Add([A, B, B], 10), A != B.
また:
?- AddUnique([A, B, B], 10).
以下と同等ではありません:?- Add([A, B, B], 10), A != B, B!=B.
が与えられた場合?- AddUnique([A,B,C,D], 4).
、4 になる一意の正の整数を指定できないため、false を返す必要があります。
?- AddUnique([A,A,A,A], 4).
が与えられた場合、 を返す必要がありA=1
ます。
質問A != B, B != C, A != C.
:このようなことをせずにロジックを述語内に移動するにはどうすればよいA != A
ですか?
wolfram-mathematica - 21 変数の不等式の境界を見つける
21 個の変数について次の不等式があります。
http://pastebin.com/raw.php?i=FTU970Em
これに対して「Reduce[ineq,Integers]」を実行すると、Mathematica が長時間ハングします。
これは理にかなっています: 不等式を満たす x[1]..x[21] の値のセットは多数あります。
私が本当に欲しいのは、各変数の境界です (たとえば、「2 <= x[i] <= 7」は各 i に対して)。
Mathematica でこれを効率的に取得するにはどうすればよいですか? これのためのより良いプログラムはありますか?
注: これはより大きなプロジェクトの一部です。
不完全なログ ファイルに基づいてリスクのようなゲームを部分的に再作成する
不等式の恐ろしいリスト全体: http://pastebin.com/CyX9f70J
上記で "Reduce[ineq,Integers]" を実行すると "false" が返されるため、おそらく間違って翻訳しました: http://conquerclub.barrycarter.info/ONEOFF/7460216.html
algorithm - スケジューリングプログラムのアルゴリズムは何ですか
タスクのスケジューリングにこの問題があります。各タスクには推奨開始時刻 T ([T-10, T+10] に開始する必要があります) があり、完了までに L 分かかり、多数のリソース [R1, R2,...] を使用します。リソースが使用されている場合、他のタスクはそれを使用できません。開始時間のみが柔軟であることを考えると、私の目標は、タスクをスケジュールして、必要なリソースにアクセスしたり、解決が必要なすべての競合を指摘したりできるようにすることです。
この目的のためにどのアルゴリズムを使用できますか? ありがとうございました。
prolog - SWI-Prolog と制約、ライブラリ CLP(FD)
clpfd ライブラリを使用して (swi) プロローグで制約をいじっています。
ある制約セットが他の制約セットをカプセル化または包含している場合を特定しようとしています。たとえば、前者が true の場合は常に後者が true であるため、X<4 は X<7 をカプセル化します。これは、論理的含意を使用して簡単に表すことができます。ただし、 #==> 演算子を使用しても希望どおりの結果が得られなかったため、not(Co1 #/\ #\Co2) を使用することにしました。Co1 と Co2 は制約です。これは個々の制約には問題ありませんが、制約の結合を Co1 と Co2 に渡したいと考えました。
今ここに摩擦があります。やってみると
私は戻ってきます
(奇妙なことに、Sicstus でこれを行うと、セグメンテーション違反が発生します)
通り過ぎると
私は希望を得る
明らかに、後者を not(Co1 #/\ #\Co2) に渡すことはできませんが、前者では必要な結果が得られません。2 つのアプローチが異なる結果をもたらす理由と、前者を後者のように動作させる方法を説明できる人はいますか?
java - 統一 - 結果の無限大
私は楽しみのために (Java で) 統合アルゴリズムを使用するアプリケーションを開発しています。
私は、統合アルゴリズムが可能なすべての統合を返すことを選択しました。たとえば、私が解決しようとすると
add(X,Y) = succ(成功(0))
それは返す
{X = 成功 (成功 (0))、Y = 0}、{X = 成功 (0)、Y = 成功 (0)}、{X = 0、Y = 成功 (成功 (0))}
ただし、場合によっては、可能な統合が無数に存在する場合があります (たとえば、X > Y = true)。
無限の数の統合が発生する可能性があるかどうかを判断できるアルゴリズムを知っている人はいますか?
前もって感謝します
prolog - 可逆な「バイナリから数値へ」述語
バイナリ ビット (たとえば、0/1 のリストなど) を数値に可逆的に変換する最良の方法は何ですか。swi でネイティブ述語を作成しましたが、より良い解決策はありますか? よろしくお願いします
prolog - Prologの単純なnth1述語
SWI Prologには、nth1というリストのn番目の項目を見つける述語があります。独自のバージョンの述語を実装したいのですが、listing(nth1)コードを見ると、SWIは非常に複雑です。それを行うためのより簡単な方法はありますか?
ありがとうございました :)。
prolog - プロローグ; フィボナッチをより効果的にしようとしていますか?
このロジック プログラミングは、私の命令型プログラミング スキルに本当に拍車をかけています。これは宿題なので、私に答えを落とさないでください。これは私が持っているものです:
次のような別の関数を作成するとします。fib(N,Value,LastValue)
.
N
は n 番目の数値、value は戻り値です。累積を使用してこれを書き換える方法がわかりません。また、逆方向にカウントするため、何かを計算する前に最後の値を「知る」方法がわかりません。:s 任意の入力を歓迎します。