2017-12-18 16 views
0

以下は私が思いついたコードです。しかし、ここには2つの問題があります。 最初に、Xの最初の値が1だけ表示されます.2番目に、Yがfalseの場合、メニュー1に戻ることはありません。 これでいくつかの助けを得ることを願っています。出力の全リストが必要です

time(office_hour,1). 
time(office_hour,2). 
menu1 :- 
    write('Input time'),nl, 
    read(Y),nl,time(Y,X),nl,write(X),nl,menu1. 

これはシナリオの例です。以下に示すように、値1のみが示されている。値2を表示するには? SRY私はあなたがバックトラックへのプロローグは、ソリューションのすべてを取得することを可能にするために必要なだけの初心者

?-menu1. 
Input time 
office_hour. 
1. 
Input time 
+0

また、行動の例を投稿する必要があります。特に、あなたは何を入力していますか? 'office_hour'でなければ' time/2'は 'menu1/0'を呼び出す前に失敗します。 –

+0

sry、私はすでに自分の投稿を更新しました。 また、 'time/2'と' menu1/0'はどういう意味ですか? 私は講師からそのような言葉を思い出すことはありません。 – Kimchi

+0

@Kimchiあなたがそれを見るなら、Prologのドキュメントにあります。 '/ n'は' n'引数を意味します。したがって、 'time/2'は2つの引数を持つ' time'です。 3つの引数を持つ 'time'があった場合、' time/3'とは異なる述語となります。 – lurker

答えて

0

です。あなたの述語の問題は、逆戻りする前に再帰呼び出しを行うことです。また、次のメニュープロンプトについては、ユーザー入力に応答してスタックを継続的に消費するため、1つ上のレベルを次のメニュープロンプトに引き続き再帰します。

fail/0と一緒にrepeat/0述語を使用するもう1つの方法があります。 repeat/0は単純に成功し、バックトラッキング中にソリューションの再クエリが可能です。 fail/0は常に失敗し、バックトラッキングが強制されます。これは、連続的なリピートループを実行する一般的な方法であり、メニューのループ処理に適しています。また、nl/0の使用量を少し調整して出力を少し調整しました。time/2という名前はあまりに一般的な名前であり、システム述語と衝突する可能性があるため、名前を変更しました。

item_time(office_hour,1). 
item_time(office_hour,2). 

menu1 :- 
    repeat, 
    nl, write('Input time'), nl, 
    read(Y), 
    item_time(Y, X), 
    write(X), nl, 
    fail. 

これが得られます:

| ?- menu1. 

Input time 
office_hour. 
1 
2 

Input time 
foo. 

Input time 
... 

をここに何が起こるfail/0は、述語句は、代替ソリューションを考え出すれるwrite(X), nlを通って、time(Y, X)に後戻りさせたものに成功することです再びwrite(X), nlに移動します。 time(Y, X)が解決策が見つからない場合は、最後に失敗し、節は常に成功してrepeat/0呼び出しに戻ります。その結果、実行が再びnl, write('Input time'), ...に移動します。

ご覧のとおり、認識できないものを入力すると、再入力するだけです。これをより完全にするために、「かなり」と認識されるアトムを追加して、データベースに存在しない入力があった場合に診断メッセージを書くことができます。それは学習のための良い運動になるでしょう。

+0

'fail/0'は何をするのでしょうか? 私はグーグルで、「常に失敗する」と言います... – Kimchi

+0

あなたは述語が失敗することに気付きましたか? 'time/2'を' office_hour'以外のもので最初のパラメータとして呼び出す場合のように。それはそうですが、変数とは無関係です。ただ失敗するだけです。障害の前に印刷するなどの副作用をしたい場合に便利です。 –

+0

@キムチ私は少し失敗を説明するために私の答えを増強した。一般的なPrologパターンは、 "repeat-fail loop"です。 – lurker

0

第二の問題:

menu1 :- 
    write('Input time'),nl, 
    read(Y),nl, 
    (time(Y,X) -> 
    write(X),nl 
    ; write('bad input'),nl), 
    menu1. 
+0

'(time(Y、Z) - > ...)'は実際に何をしていますか? 私は括弧を意味します – Kimchi

+0

If-then-else、マニュアルを読むことを試みてください:) –

+0

私はちょうど 'time(Y、X) - > write(X)、nlを書くならば ;書き込み( '悪い入力')、括弧なしのnl'? 私が知っている ' - >'はif-then-elseを意味します – Kimchi

関連する問題