問題タブ [swi-prolog-for-sharing]
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 - SWI-Prolog swishで挿入述語を使用していますか?
単純な 3 行のコードのように見えるものを実行しようとしています
しかし、何らかの理由でSWISH、IDEoneなどの多くのオンライン コード コンパイラでコンパイルまたは実行することができません。問題は、「挿入」が認識された述語ではないことです。私はいくつかのグーグル検索を試みましたが、挿入するものは何もないようです。ありがとう!(プロローグ初心者でごめんなさい)
編集: ASCII 以外の文字に問題があったようです。ERROR: /home/F3Vzlp/prog:10:21: Syntax error: Operator expected ERROR: /home/F3Vzlp/prog:11:21: Syntax error: Operator expected のエラーが発生しました。
prolog - 比較の結果を Prolog に保存して後で使用するにはどうすればよいですか?
2 つの値を比較し、結果を参照可能な変数として返す述語 (明らかに不必要ですが、例です) を書きたいとします。次のようになります。
しかし、Swishではエラーが発生します。
をResult
取得した後、その値を別の述語でどのように使用しますか? 次のように言えますか?
それとも、Prolog の哲学を完全に誤解していますか?
prolog - RDF をインポートする
URLからSwishにrdfファイルをインポートすることは可能ですか?
つまり、次のようなものです。
myload:- load_rdf('www.myrdf.com').
次に、クエリを実行できます?-rdf(A,B,C)
prolog - カットを読む!プロローグで
Learn Prolog Now!を読んでいます。のカットに関する章と、同時に Bratko の人工知能のためのプロローグ プログラミング、第 5 章: バックトラッキングの制御。最初は、カットは他のプログラミング言語で知られている if-else 句を模倣する簡単な方法のように見えました。
false
ただし、行の下に記載されているように、このコードは、期待している場合でもすべての変数がインスタンス化される場合に失敗します。
理由は明らかです。最初のルールは失敗し、2 番目のルールにはもう条件が関連付けられていないため、成功します。私はそれを理解していますが、解決策が提案されています(ここではスウィッシュです):
そして、これをどう読むべきか、私は混乱している。私は、「これより前に来るすべてが真である場合、同じ述語を持つ他のルールを含めて終了を停止!
する」という意味だと思いました。!
ただし、これは正しくありません。これは、 のインスタンス化がY = Z
失敗した場合にのみ発生することを意味し、そのルールでは役に立たないからです。
では、カットは「人間的」な方法でどのように読み取られるべきでしょうか? そして、拡張として、max/3
上記の提案されたソリューションをどのように読むべきですか?
prolog - clp(fd)ですべての組み合わせのプロローグ検索をバインドする方法は?
私がやりたかったことは、特定のリストから要素のすべての組み合わせを生成することでした。例: [a,b,c] から、次のことが必要になる場合があります。
等々。おそらく、これを行う魔法のプロローグワンライナーがあります。もしそうなら、私はそれを聞いてみたいです。
ただし、私の質問は、この特定の問題を解決することではなく、Prolog の検索アルゴリズムの微妙な点を誰かに説明してほしいということです。
したがって、上記の問題を解決するために最初に行ったことは次のとおりです。
これはうまく機能しますが、可能なすべての結果を返しますが、適切な順序ではありません。
問題ありません。私は本当に特定の長さまでのすべての組み合わせが欲しいだけです。そこで、最初に正確に特定の長さのものを取得することにしました。
これは、たとえば長さ 2 の場合にうまく機能します。
等々。clpfd を使用して上記の関数を利用して、特定の長さまでのすべてのリストを取得しようとした私の試みはうまくいきませんでした:
作品の種類。正しい結果 (長さが Bound 未満のリスト) を見つけます。しかし、それらが見つかった後、さらに結果を探して継続的にループします。たとえば、長さ 2 の場合:
これが私の質問の核心だと思います。(トレースによると) prolog が可能な解決策としてますます大きなリストをチェックし続ける理由を誰かが説明できますか? そして、プロローグがこの運命の旅を避けるのを助ける方法があるかどうか誰か教えてもらえますか?
最終的には次のコードを使用して問題を解決しましたが、clpfd の整数制約を使用してリストのサイズを制限する方法がわからなくてがっかりしました。
SWISH に関連するすべてのコードは次のとおりです: http://swish.swi-prolog.org/p/allcombos.pl