SWI-Prolog (マルチスレッド、64 ビット、バージョン 7.3.5) を使用して、段階的に進めます。
モジュールでdcg nonterminalを定義します(発音: " di-SEE-goh "):
a//1dcgAux:- モジュール(dcgAux,[a//1])。 a(0) --> []. a(s(N)) --> [a]、a(N)。
とを使用して、次のクエリを実行し
phrase/2ますapply:foldl/4。?- use_module([ライブラリ(適用),dcgAux])。 真実。 ?- フレーズ( foldl( a,[s(0),s(s(0))]),[a,a,a]). 真。 ?- フレーズ( foldl(dcgAux:a,[s(0),s(s(0))]),[a,a,a])。 真。 ?- フレーズ(適用:foldl(dcgAux:a,[s(0),s(s(0))]),[a,a,a]). 真。 ?- 句(適用:foldl( a,[s(0),s(s(0))]),[a,a,a])。 エラー: apply:foldl_/4: 未定義のプロシージャ: apply:a/3
ねえ!かなりの驚きであり、良いものではありません。未知の未知のものを見逃していませんか?
上記の苛立たしい行動を取り除くには、まずその原因を突き止める必要があります。
?- import_module(適用、M)、M=ユーザー。 偽。 ?- 句(適用:foldl(a,[s(0),s(s(0))]),[a,a,a])。 エラー: apply:foldl_/4: 未定義のプロシージャ: apply:a/3 ?- add_import_module(適用、ユーザー、終了)。 真実。 ?- import_module(適用、M)、M=ユーザー。% シック! M = ユーザー。% `?- import_module(apply,user).` 失敗! ?- 句(適用:foldl(a,[s(0),s(s(0))]),[a,a,a])。 真。
どうしたの?私がそれを見る方法はこれです:
- に渡されるゴールのモジュール拡張
foldl/4は制限されています。 のSWI-Prolog マニュアルページ
import_module/2からの引用:すべての通常のモジュールは、システムからインポートするユーザーからのみインポートします。
SWI
library(apply)は からのみ「継承」しますsystemが、 は継承しませんuser。applyモジュールを複製applY(および新しいモジュール名を伝搬) すると、次のことがわかります。?- use_module(applY)。 真実。 ?- フレーズ( applY :foldl(a,[s(0),s(s(0))]),[a,a,a]). % だった: エラー true。% 今OK!
私がどのように進めるべきか、どのように進めるべきかについて、あなたのアイデアを共有してください!
(他の Prolog プロセッサで同様の実験をまだ行っていません。)