目標を証明しようとすると、特定のサブの値がない場合に入力を求めるKBを書きたい-ゴール。例えば、次の点を考慮してください
可能な目標:Prolog:ユーザーに値がわからない場合にのみ質問する
blue(X) :-
color(X,blue).
white(X) :-
color(X,white).
yellow(X) :-
color(X,yellow).
orange(X) :-
color(X,orange).
red(X) :-
color(X,red).
:
- ユーザーが色ため
blue(name).
に入る:askColor(X,Y) :- write('color of '),write(X),tab(2), read(Z), asserta(color(X,Z)), Y==Z. %only return "true" if the asserted color is the one we're looking for. % trying to do "if we know the color is not Y, fail. otherwise (if we don't have a value for the color) ask the user". however, it always asks the user :( color(X,Y) :- atom(Y), ((Z\=Y,atom(Z), color(X,Z)) -> fail ; askColor(X,Y)).
が所望の結果は、このあろうが「名前」は不明ですが、ユーザーに尋ねます。ユーザーが「青」を入力すると、
color(name, blue)
がKBに格納され、結果として「真」になります(次のステップでこれを仮定します)。それ以外のものが入力された場合は、情報を格納して「false」を返します。これは適切に動作するようです。 blue(name)
またはcolor(name,blue)
の将来のクエリは、予想どおり直ちに "true"を返します。- 今物事がうまくいかないところ:ソリューションとして
color(name,Y)
リターンY=blue
へ- 将来のコールを、しかし、それはまた、ユーザーの入力を要求します。
red(name)
またはcolor(name, red)
を呼び出しても、入力を求められます。color(name,blue)
が知られており、「青」が「赤」に等しくないので、すぐに「false」を返すべきです。
私は、この特定の例のために、それがサポートされる値(私はそのためのコードを持っている)の集合間のメニューで選択するようにユーザーに依頼するより多くの意味を行うことができることを理解しています。しかし、私のプログラムの他の部分は、整数に対して同じことをする必要があります。
これはPrologプログラムの非常に時代遅れのスタイルです。そのスタイルをきちんとカバーする[チュートリアル](http://www.amzi.com/AdventureInProlog/)があります。まったく同じ組み込み関数があるかどうかはわかりませんが、すべてのPrologはこのチュートリアルで何らかの形で使われている機能を持っています。 –