prolog:在事实中使用列表的元素

时间:2017-03-22 14:57:39

标签: list prolog

我想制作一个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

1 个答案:

答案 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版本更优雅。