簡體   English   中英

GNU Prolog-搜索事實列表

[英]GNU Prolog - searching a list of facts

我一定要放屁,但是我似乎找不到解決辦法。

如果您有以下事實,例如:

%country(country, population, capital)
country(sweden, 8823, stockholm).
country(usa, 221000, washington).
country(france, 56000, paris).
country(denmark, 3400, copenhagen).

%city(city, country, population)
city(lund, sweden, 88).
city(new_york, usa, 5000).
city(paris, usa, 1).
city(copenhagen, denmark, 1200).
city(aarhus, denmark, 330).
city(odense, denmark, 120).
city(stockholm, sweden, 350).
city(washington, usa, 3400).
city(paris, france, 2000).
city(marseilles, france, 1000).

我想找到第二大人口稠密的城市,在這種情況下將是美國華盛頓州3400人。 您將如何做到這一點?

謝謝。

嘗試以下尺寸:

second_largest_city(City) :-
    findall(Size, city(_, _, Size), Sizes),
    sort(Sizes, SortedSizes),
    append(_, [Size2, _], SortedSizes),
    city(City, _Country, Size2).

說明: findall/3查找所有city/3事實的大小,這些事實按sort/2 升序排序,其中刪除重復項 append/3模式的調用匹配將已排序列表SortedSizes分為兩部分; 一個任意大小( _ )和長度為2的余數( [Size2, _] )的列表-這將變量Size2綁定到city/3事實中的第二大城市大小。 最后,所有具有此大小的城市都位於city/3事實之中,並受輸出約束。

注意:如果您的sort/2內置內置程序沒有刪除重復項,那么通常這將無法正常工作,因為這有可能使city/3事實的最大值大於一個等於僅返回最大值(最大) 。 這種使用append/3來查找大小排序列表中倒數第二個元素的實現還假定sort/2排序的數字按升序排列。

此外,最后要注意的是,如果少於兩個city/3事實,這將徹底失敗-但這可能很好,因為該謂詞尋求“第二大”城市,嚴格來說,除非有一個,實際上,數據庫中至少有兩個大小不同的城市。 如果這是一個問題,則可以為second_largest_city/1寫更多子句來處理這種情況。

@sharky的出色答案的簡短版本:

second_largest_city(Second) :-
    setof(Size/City, Country^city(City,Country,Size), Cities),
    append(_, [_/Second, _], Cities).

setof結合了findallsort 我們收集Size/City對,以便它們自動按尺寸排序。 構造X^Goal引入了一個存在量化的變量X (如一階邏輯中的x )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM