2017-03-22 10 views
1

与えられた(ユーザー入力)場所のイベントの会場名と家賃を示すPrologコンソールアプリケーションを作成したいと思います。これまで私は与えられた(ユーザー入力)場所の会場のリストを作成することができました。プロローグ:ファクト内のリストの要素を使用

私のコードは以下の通りです。すべてのリスト要素の家賃を得るためにvenue_rent実際にvenuesリストを使用する方法は

Enter a location 
->washington. 
[washington_party_hall1,washington_party_hall2] 
true. 

あります:

listing(venue_location). 
listing(venue_seating). 
listing(venue_overhead). 

venue_location(washington_party_hall1, washington). 
venue_location(washington_party_hall2, washington). 
venue_location(newyork_party_hall1, newyork). 
venue_location(newyork_party_hall2, newyork). 

venue_capacity(washington_party_hall1,300). 
venue_capacity(washington_party_hall2,450). 
venue_capacity(newyork_party_hall1, 340). 
venue_capacity(newyork_party_hall2,500). 

venue_rent(washington_party_hall1,1350). 
venue_rent(washington_party_hall2,1200). 
venue_rent(newyork_party_hall1,1500). 
venue_rent(newyork_party_hall2,1000). 

main:- 
    write("Enter a location"),nl,write("->"), 
    read(Loc), 
    findall(X,venue_location(X,Loc),Venues), 
    write(Venues). 

これは、次のような出力を提供しますか? 私はこのように彼らの賃料でこれらの会場の名前を表示したい:

washington_party_hall1 1350 
washington_party_hall2 1200 

答えて

2

あなたが与えられた会場を持っている場合Venueを言って、あなたはあなたの事実から家賃を得ることができることを知っている:

?- Venue = washington_party_hall1, venue_rent(Venue, Rent). 
Rent = 1350 

リストVenuesで会場のすべてのために家賃を取得したい場合は、member/2を使用することができます。

?- Venues = [washington_party_hall1,washington_party_hall2], member(Venue, Venues), venue_rent(Venue, Rent). 

それはあなたが望むものの基本的なクエリ構造です。これにはない

write_venue_rents(Venues) :- 
    member(Venue, Venues), 
    venue_rent(Venue, Rent), 
    write(Venue), write(' '), write(Rent), nl, 
    fail. 

:あなたは素敵な形式で端末に物事を書きたい場合さて、あなたはフォーマットされた方法で項目のリストを表示するための一般的な方法です失敗駆動ループを、使用することができます整列された列を与えますが、あなたはその考えを得ます。 Prologの書式設定オプションと述部を調べて、出力を好みに合わせてフォーマットすることができます。

もう一つの方法は、maplist/2を使用することです:

% Write out the rent for a given venue 
write_venue_rent(Venue) :- 
    venue_rent(Venue, Rent), 
    write(Venue), write(' '), write(Rent), nl. 

% Write out the rent for a list of venues 
write_venue_rents(Venues) :- 
    maplist(write_venue_rent, Venues). 

私はmaplist/2バージョンは、よりエレガントだと思います。

+1

「maplist/2」のようなものを探していました。この述語の例を示すよい文書をいくつか用意してください。私はこの述語を頻繁に使用しなければならないかもしれません。 –

+0

@AhashanAlamSojib私は残念なことに、例を持つ良いオンラインドキュメントを見つけられませんでした。しかし、それはかなり簡単です。 'maplist'は、リストがすべて同じ長さであるという一般的な期待に基づいて、1つまたは複数のリストに対して目標を反復します。引数の数にはいくらかの制限があります。たとえば、 'call(goal(a)、b)'が 'call(goal(a、b)) 'と同等であるという事実を使用します。したがって、 'maplist(foo(X、Y)、L1、L2)'は 'L2'の' E1'と 'E2'の各要素' E1'に対して 'foo(X、Y、E1、E2)'を単に呼び出します。 – lurker

+1

いくつかのリスト要素に対して 'maplist/2'の与えられた目標が失敗した場合、プロセスを停止しますか? 'maplist/2'の目標でいくつかのフェイルセーフオプションを使用できますか? –

関連する問題