問題タブ [meta-predicate]
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.
variables - Prolog でファンクター名を変数のように使用するにはどうすればよいですか?
私たちのプロローグコースにはこの課題があります。週に 1 時間の Prolog を 2 か月続けた後でも、それはまだ謎に包まれています。私の思考は手続き型言語から適応できないようです。
同じ名前でアリティ 1、2、3 の述語/ファンクターを含むナレッジ ベースがあります。呼び出し形式は次のようになります。
search(ファンクター名、引数、S)。
答えは、アリティに関係なく、このファンクター名と引数を持つすべての出現を見つける必要があります。回答は次の形式にする必要があります。
call を使用して、ナレッジ ベースのエントリが存在するかどうかをテストできることがわかりました。
しかし、呼び出しはファンクター名の変数では機能しないようです。ファンクター名に変数を使用する方法がわかりません。
アップデート:
私の質問は部分的に答えられました。私の新しいコードは、アリティ 1、2、および 3 について true と false を返します (以下を参照)。
更新 2:
別の部分的な回答が来ました。それは用語のリストとして S を与えますが、「その他の」引数はプレースホルダーです:
結果はかなりいいです。まだ欠落しています: 述語は括弧内にあってはならず、他の引数は、プレースホルダーとしてではなく、ナレッジ ベースから文字どおりに取得する必要があります。現在の結果は次のようになります。
最初から質問の仕方が間違っていたので、この質問は諦めます。私はもっと具体的に尋ねるべきでした - 私はまだPrologが得意ではないので、できませんでした。
@false が最も役に立ちました。私は彼の答えを受け入れています。
eclipse - SICStus SPIDER でメタ引数の警告を回避するには?
これはおそらくcomp.lang.prolog-discussionに関連しています。
SICStus SPIDER で Eclipse を使用すると、次のような警告がいくつか表示されます。
コードサンプルは次のとおりです。
SPIDER 警告を取り除くにはどうすればよいですか? 単に警告を抑制することにはあまり興味がありません。SPIDER IDE の最新バージョン (0.0.51) と SICStus Prolog 4.2.3 を使用しています。
module - meta_predicate 宣言がある場合に rec/3 をコーディングするにはどうすればよいですか?
meta_predicate 宣言なしで正常に動作する次のコードがあります。述語 rec/3 を次のように定義しました。
述語 rec/3 は、基本的に次の高階再帰方程式を実装します。
* は 2 つの関係の合成です。たとえば、後継者に関して追加を定義するために使用できます。後継者は次の関係になります。
追加は次のように行うことができます (SWI-Prolog):
ここで、rec/3 の節の前に、次のように meta_predicate 宣言を追加するとします。
動作しなくなりました (SWI-Prolog):
meta_predicate が存在する場合に機能するように、rec/3 とクエリの句を修正するにはどうすればよいですか?
さよなら
prolog - 「!」を使用する理由 プロローグで
これは私が理解しようとしているコードです。
「!」の使用は何ですか 上記のコードの述語 p(,,) 。または、上記のコードのすべてのステップにコメントを追加して、理解できるようにすることはできますか。ありがとう。
prolog - 再帰推移閉鎖の定義
多くの述語は、基本的に何らかの形式の推移閉包を使用しますが、終了にも対処する必要があることを発見するだけです。これを一度だけ永遠に解決してみませんかclosure0/3:
この定義を推移閉包の実装に使用できない場合はありますか?
なぜ dif/2 なのですか?
@WouterBeek のコメントに詳細に答えるには: dif/2oriso_dif/2は、潜在的な問題を表示または通知できるため、理想的です。ただし、現在の実装では、トップレベルのループが実際の問題を隠していることがよくあります。closure0(\_^_^true,a,b)確かにそれ自体が非常に問題のある目標を考えてみましょう。次のシステムを使用する場合、実際の問題は直接目に見えません。
どちらの最上位ループも、実際に見たいもの、つまりダングリング制約を示していません。SICStus では、置換を生成するために疑似変数が必要です。SWI では、クエリを でラップする必要がありますcall_residue_vars/2。このようにして、制約が付加されているすべての変数が表示されるようになりました。
prolog - プロローグ、グラフが非循環かどうかを判断する
グラフを入力として受け取り、そのグラフが非循環かどうかを判断する述語 acyclic/1 を定義する必要があります。だから私の理解から
いいえとを返します
はいを返します
グラフ内の 2 つのノードが接続されているかどうかを判断する述語を作成しました。接続されている場合は、yes が返されます。
これを使用して、グラフが非循環かどうかを判断する方法はありますか?
定義済みの述語を使用したくありません。
prolog - プロローグでグラフが接続されているかどうかを判断する
isConnected/1グラフを引数として取り、ペア間に無向パスがあるかどうかを判断する述語を作成する必要があります。
エッジのリストがあるとします(Gグラフはどこにありますか):
したがって、3 と 4 の間にエッジがないため、これは失敗するはずです。
この問題にどのようにアプローチしますか?各エッジをトラバースして、エッジをリストに記録する必要がありますか? または、これを行うためのより良いアプローチはありますか?
prolog - 関係に関して順序付けられた整数のシーケンスを記述する最も一般的な高次の制約
CLP( FD ) では、しばしば次のように述べる必要があります。
このタスクに一般的な (パラメーター化可能な) 組み込みの制約を提供する CLP(FD) システムはありますか?
SWI-Prolog は と呼ばれる制約を提供しますchain/2。これは、私が探しているものと似ています。ただし、その名前は、制約が記述できるすべての関係を網羅するには、少し具体的すぎます (例:#<は半順序ではありませんが、 で許容されchain/2、整数のセットとして取得されるシーケンスにつながります。数学的秩序理論)。したがって、その名前は、制約が実際に実装するものを完全には説明していません。
通常のバイナリ CLP(FD) 制約に関する最も一般的な定義、または制約が定義する代数構造による適切な名前を含む、少なくとも、 、およびを含む適切なサブセットを#<指定#>し#=<て#>=ください。課せられる条件は、制約が文献で適切な名前を持つ実際の数学的構造を記述することです。
まず、SICStus Prolog または SWI を検討してください。
サンプルケース:
を許可することさえ許容されることに注意してください。これは#\=、リレーションが数学的順序理論で知られているように結合を記述するためです。したがって、上記のコードは、通常のバイナリ CLP(FD) 制約に関して最も一般的ではありません。
prolog - 述語からすべての「最小」ソリューションを収集する
データベースに次の事実があるとします。
最小の 2 番目の引数と 2 番目の引数の値を持つすべての最初の引数を収集したいと考えています。初挑戦:
の代わりにsetof/3、次を使用できますaggregate/3。
注意
これは、数値の最小値を探している場合にのみ同じ結果をもたらします。算術式が含まれている場合、結果は異なる場合があります。数値以外が含まれている場合はaggregate(min(...), ...)、エラーがスローされます!
または、代わりに、キーでソートされた完全なリストを使用できます。
最後に、質問に:
これをライブラリ(集約)で直接行うことはできますか? 出来るはず…という感じです。
std::partition_pointまたは、C++ 標準ライブラリのような述語はありますか?または、これを行う簡単な方法はありますか?
編集:
より説明的になるために。(ライブラリ) 述語があったとしますpartition_point/4:
(名前は好きじゃないけど、今は我慢できる)
それで: