我想制作一个Prolog控制台应用程序,显示给定(用户输入)位置的任何事件的场地名称和租金。到目前为止,我已经能够创建给定(用户输入)位置的场地列表。
我的代码如下。
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).
这给出了以下输出:
Enter a location
->washington.
[washington_party_hall1,washington_party_hall2]
true.
有没有办法在venues
事实中使用venue_rent
列表来获取每个列表元素的租金?
我想以这种方式用租金显示这些场馆的名称:
washington_party_hall1 1350
washington_party_hall2 1200
答案 0 :(得分: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
版本更优雅。