2017-05-27 22 views
0

私はthisから取られたプロローグの練習をしています。プロローグに入力と出力を設定できません

ここでやりたいことは、プログラムの入出力方法を変更することです。
Iコンソールでこれを入力してプログラムを実行する必要がありますだけたとえば

goldbach(100, L). 

、及びIは、押す必要があり、以前のものが画面上に印刷されている場合、次の結果を表示します[]。

L = [3, 97]; 
L = [11, 89]; 
L = .... 

しかし、私がしたいことは以下のようなものです:最初に、あなたの入力を読んで、その後、自動的にすべての可能な結果を​​プリントアウト:プログラムは、「番号入力」を出力しますです

Input a number:100. 
L = [3, 97]. 
L = [11, 89]. 
..... 

私は(読み取りについての説明を参照)と書くが、私はこれらを追加したとき、私は失敗を取得している:

read_gold :- 
    write('Input a number:'), 
    read(X), 
    write(goldbach(X, L)). 

私は私が欲しいの入力および出力を達成するためのプログラムを作るために自分のコードを修正するにはどうすればよいです?回答ありがとうございます。

+0

トップレベルを修正または再実装する必要があります。間違いなく、初心者にとっては複雑すぎる。 – false

+0

'goldbach(X、L)'を問い合わせる結果を得るために 'write(goldbach(X、L))'を実行することはできません。述語は関数が値を返すときに解を返さない。 – lurker

答えて

2

このようなものは、あなたが求めているものをそのまま使用しますが、通常はPrologのクエリとソリューションの使い方ではありません。一度にすべてのソリューションを収集する

read_gold :- 
    write('Input a number:'), 
    read(X), 
    show_results(goldbach(X)). 

show_results(Query) :- 
    call(Query, L), 
    write('L = '), write(L), write('.'), nl, 
    fail. 
show_results(_). 

クリーンな方法はfindall/3を使用してそれらをリストすることです:

read_gold(Solutions) :- 
    write('Input a number:'), 
    read(X), 
    findall(L, goldbach(X, L), Solutions). 

あるいは、明示的に確認メッセージを表示せずに:

read_gold(X, Solutions) :- 
    findall(L, goldbach(X, L), Solutions). 

として、それを問い合わせます例えば、

?- read_gold(100, Solutions). 
Solutions = [[3, 97], [11,89], ...] 
+0

用語を書くのに 'write/1'を使うことはかなり問題です。むしろ 'writeq/1'を使用してください – false

+0

あなたのお返事ありがとうございます。今私はクエリについて読むべきであることを知っています。ほとんどの問題を解決することは大切です。 – Limoncool

関連する問題