PHP を Prolog に正常に接続し、ファイルに存在する必要なナレッジ ベースをクエリし、関数knowledge_base.pl
を介して結果をエコーすることができました。php exec
true
各クエリの実行後に Prolog が返す/false
値をエコーする際に問題が発生したため (前の質問を参照)、実装に問題がある解決策を思いつきました。
knowledge_base.pl
これらの事実とルールを含む単純なファイルがあるとします。
girl(erin).
boy(john).
likes(erin, reading).
likes(john, reading).
hangs_out_with(erin, X) :-
likes(X, reading),
boy(X),
writeln('Someone s got a new friend!!').
が女の子かどうかを知りたいとしましょう。erin
もしそうなら、それが本当だと書くか、そうでなければ、それが間違っていると書きましょう。knowledge_base.pl
これをファイルに追加しました:
girl(erin) :-
girl(erin)
-> write('it is true')
; write('it is not true').
クエリを入力すると?- girl(erin).
、out of local stack
エラーが発生します。Web を検索したところ、これは無限再帰によるものであることがわかりました。
だれか書き方のヒントをくれませんか
girl(X) :-
( girl(X)
-> write('it is true')
; write('it is not true')).
プロローグで?前もって感謝します。
新しいユーザーとして、私は写真を投稿することを許可されていません。
SWI-Prolog の出力:
1 ?-hangs_out_with(erin,kosta).
false.
2 ?-hangs_out_with(erin,john).
Someone s got a new friend!!
true.
コマンド プロンプトの出力:
C:\(directory)>swipl -q -f knowledge_database.pl -g hangs_out_with(erin,kosta),halt.
1 ?-halt. (the halt is inputted by me.)
C:\(directory)>swipl -q -f knowledge_database.pl -g hangs_out_with(erin,john),halt.
Someone s got a new friend!!
最初のクエリは失敗し、2 番目のクエリは成功します。ご覧のとおり、クエリ実行後のプロローグは true/false を出力しますが、コマンド プロンプトで同じクエリを実行すると、true/false 値はエコーされません!!