問題タブ [dcg]
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.
java - セマンティック Web における SWI-Prolog
SWI-Prolog のセマンティック ライブラリを使用した、実際のプログラミング経験のある方からのご意見をお待ちしております。
編集: この質問の理由は、私がプロローグの経験を持つ多くの人々と話をした中で、彼らのほとんどが学術プロジェクトで何らかの AI プログラミングにプロローグを使用しているように見えるからです。誰かが本番環境で広く使用しているかどうかを知りたかった. リアルタイムの保守性のため、パフォーマンスは、良い成績を得るためにプロジェクトを実行するのとは異なります。
Java のようなプログラミング言語とどのように統合しましたか?
編集:回答で述べたように、REST サービスまたは SWI-Prolog の外部インターフェイスの使用が 2 つの最適なオプションのようです。
(セマンティック Web のコンテキストで) Prolog ライブラリを何に使用しましたか?
おそらく、ここでこれに対する明確な答えを得ることはできません。おそらく、この質問はセマンティックオーバーフローに属しています。私は今、公正な考えを持っており、より適切なフォーラムでこの議論を続けます.
どの開発環境を使用しましたか? SWI-Prolog が提供する Emacs またはそのバリアントが圧倒的な答えのようです。
Intellij IDEA for Java のような IDE はまったく必要ありませんでした。結局どうしよう、オートコンプリート?ルールベースの言語の必要性を理解しています。繰り返しになりますが、開発環境について説明した理由は、ルール (デバッグ) を追跡し、知識セットの異常を特定するのに役立つからです。SWI-Prolog のグラフィカル トレーサーは最初の要件を処理しますが、少なくとも私には、見掛け倒しで制限があるように見えました。しかし、私は他に何かがあるとは信じていません。
SWI-Prolog を使用するというアイデアは本当に気に入っていますが、生産性に影響する場合は使用を控えます。
回答で述べたように、Prolog は得意なことを実行するために使用する必要があります。私は常にこれを知っていたので、他のプログラミング言語との統合に関する私の質問です。最大の生産性の豚は開発者の質であり、開発段階にあるようです。システムの問題は休止状態で簡単に修正できない場合がありますが、一連の質問を使用してシステムの有効性を確認することで対処できます。
注: 回答について言及するときは、@littletable によって提供された回答を意味します。また、セマンティック Web 用の SWI-Prolog に興味がある人にとっては、theaが興味深いようです。
prolog - Prolog の DCG の問題点
このプロジェクトは、半自然言語を SQL テーブルに変換することに関するものです。コード:
正常に動作する方法は次のとおりです。
しかし、ここでは機能しません:
どうやらそれは真実として認識されていませんtable("student")
。上記のように、「学生」をラベルとして認識します。何を与える?
prolog - PrologのDCGを貪欲にしないようにする方法は?
アルファベットラベル、スペース、スペースまたは文字を含む可能性のある疑似ラベル、別のスペース、別のアルファベットラベル、そして最後にピリオドを受け入れるDCG述語を次のように記述したいと思います。
ラベルのコードは次のとおりです。
label_madness
のような文字列をフィードする"Alice is responsible for Bob."
と、失敗します。不思議な理由trace
で動作を拒否しますが、DCGが全体に一致するため失敗すると思いis responsible for Bob
ますRel
。ラベルの間にスペース以外の区切り文字を試してみましたが、正常に機能します。label_with_spaces
必要なだけの入力のみを消費するように述語を書き直すにはどうすればよいですか?
perl - Perlコードを生成するDSLとしてのプロローグ?
Perlコードを生成するDSLを実装するためにprologで書かれたコードの例を知っている人はいますか?
prolog - プロローグ構造から単語を抽出する
Prolog で自然言語解析のタスクを設定しました。これまでのところ、プログラムはある程度機能しています。これまで のところsentence(noun_phrase(det(the), np2(noun(cat))), verb_phrase(verb(sat), pp(prep(on), noun_phrase(det(the), np2(noun(mat))))))
、リストを入力すると印刷されますが[the,cat,sat,on,the,mat]
、これで問題ありません。
私がしなければならない次のタスクは、文からキーワードを抽出することです。つまり、名詞句から名詞を抽出し、動詞句から動詞を抽出し、動詞句から名詞を抽出することで、リストを返すことができます: [cat,sat 、マット]。私はこれに非常にこだわっているので、誰かが私に手を差し伸べてくれませんか。ありがとう!
私の現在のコードは次のとおりです。
prolog - グローバル変数をエミュレートするためのアサートとリトラクト
グローバル変数をエミュレートするためにこれを行っています:
別の方法はありますか?(変数を引数として渡すことに加えて、つまり)。必ずしもより効率的であるとは限りません。ただ興味があります。
prolog - Prologの質問-簡単な文法の実装
次の文法がある場合:
Prologに実装するにはどうすればよいですか?
私はこれを試しました:
ただし、リストの先頭をリストにすることはできないため、明らかに機能しません。
次に、次のように新しいバージョンを実装してみました。
ただし、入力isMatched([a,b,a])
の場合、スタックが不足します。
これを修正するにはどうすればよいですか?
prolog - Prolog DCG を使用して文字列を分割する
DCG を使用して、文字列をスペースで区切られた 2 つの部分に分割しようとしています。たとえば、「abc def」は「abc」と「def」を返すはずです。プログラムとDCGは以下です。
これは正しく動作します。しかし、[ P1 | Part1 ]
&を入力しなければならないの[ P2 | Part2 ]
は本当に冗長であることがわかりました。そこで、の定義で[ P1 | Part1 ]
w/ Part1
& 同様に w/のすべてのインスタンスを置き換えてみました。つまり、次のようになります。[ P2 | Part2 ]
data
入力するのははるかに簡単ですが、Arguments are not sufficiently instantiated
エラーが発生しました。したがって、バインドされていない変数は、DCG のコードのリストとして自動的に解釈されないようです。これを冗長にする他の方法はありますか?私の意図は、他のプログラミング言語で正規表現を使用するところに DCG を使用することです。
debugging - SWI-prolog でのデバッグ - バインドされていない変数
次の Prolog コードを検討してください。入力内の特定のタイプの行を編集し、変更なしで残りの行を出力します。rule
質問には重要ではないため、以下に含まれていないDCG を使用します。
これはうまくいきます。ただし、processInput/1
次のように変更すると、Warning: /home/asfernan/tmp/tmp.pl:28: Goal (directive) failed: user: (go,halt)
.
phrase(rule(Part1, Part2), Codes)
DCG マッチの if & else 部分が入れ替わっています。これは明らかに初心者の間違いですが、失敗したという事実go, halt
はあまり役に立ちません。Part1
&Part2
が行にバインドされていないためにエラーが発生したことをエラー メッセージに示すにはどうすればよいformat('~s - ~s\n', [ Part1, Part2 ])
ですか? コードが小さいため、このエラーを突き止めることができましたが、コードが大きかったと追跡できなかった可能性があります。
parsing - プロローグでの構文解析
このパーサーでは、increaseが指定されている場合は1が出力され、decreaseが指定されている場合は0が出力されます。ただし、リストの最後の要素を処理するときに問題が発生します。たとえば、run(A,[increase],[])
2つの1を出力します。run(A,[increase,decrease],[])
1つと2つの0を出力しますが、これは私が望まないことです。run(A,[increase],[])
1をrun(A,[increase,decrease],[])
印刷して1,0を印刷するように正しく機能させるにはどうすればよいですか?