1

私は、どの国が最大の面積を持っているかを出力することを目的とする述語を持っています(最大の国境=最大の面積を持つ国)。これは私の述語がどのように見えるかです:

/* If I write get_country(X, 'Europe'). then all the countries in Europe 
that isn't bordering a sea gets printed out. 
However as you can see I am creating a list 
with all of the countries and then I want to
take the largest country from all of these 
and print that one out. But instead 
all of the countries gets printed out 
with their length, ex: X = hungary ; 359 (length) ...  */
get_country(Country, Region):-
    encompasses(Country,Region,_),
    not(geo_sea(_,Country,_)),
    setof(Length, country_circumference(Country,Length), Cs),
    largest(Cs, X),
    write(X).

その述語内で使用される述語は次のとおりです。

country_circumference(Country, X):-
    setof(Length, get_border_length(Country, Length), Cs),
    sum(Cs, X).

largest([X],X).
largest([X|Xs],R) :-
    largest(Xs,Y),
    R is max(X,Y).

ここで私が間違っていることを誰かに教えてもらえますか? すべての国をリストに追加してから、リストに入れながら 1 つずつ印刷するのではなく、リストをトラバースして最大の境界線を持つ国を見つけるにはどうすればよいですか? 前もって感謝します。

4

1 に答える 1

2

Prolog は用語の自然な順序を定義します。たとえば、次はtrue です

foo(3, z) @< foo(10, x)
bar(2, 9) @< foo(3, 1)

比較演算子と数値比較という用語の使用に注意してください。述語 ,は項比較を行います。@< <setof/3

国境が最も長い国を見つけたい場合は、用語の比較を利用しsetof/3て、並べ替えたい項目を最初の引数として含む類似の用語を収集することで実行できます。この場合、最初に円周が必要です。さらに、get_country述語の意図した意味を正しく理解している場合は、クエリの一部として考慮したい国を定義するクエリを に含める必要がありますsetof/3

get_country(Country, Region):-
    setof(L-C-R, X^Y^Z^( encompasses(C, R, X),
                         \+ geo_sea(Y, C, Z),
                         country_circumference(C, L) ), Cs),
    reverse(Cs, HighToLowAreas),
    member(_-Country-Region, HighToLowAreas), !.

member/2述語句の最後にある は、 と が最初にインスタンス化されていない場合は最初の要素となる、 に一致するリスト内の最初の要素を検索しHighToLowAreasます。_-Country-RegionCountryRegion

X^Y^Z^これらをクエリのセレクターから除外するには、存在量指定子が必要です。のコンテキストでは、を使用_してもそれは行われませんsetof/3。ここでは、-(-(X,Y),Z)便利な書き方なので、フォームという用語を使用していますX-Y-Z。しかし、ここでも同様に使用できfoo(X, Y, Z)ます。はreverse/2リストCs降順で配置し、そのリストの先頭からCountryandを、 で選択するだけです。Region[_-Country-Region]

于 2015-03-03T12:17:07.820 に答える