0

私が取り組んでいる Prolog プログラムのこの部分の私の目標は、リストのリストの特定のフィールドにアクセスすることです (リスト内のルートの停止ポイントとそれに続くルート全体の距離を含みます)。

リストのリストの現在の形式は次のとおりです。

RoutesAndDistances = [[[Start, Stop1, Stop2, ..., End], TotalDistance],
                      [[Start, Stop1, Stop2, ..., End], TotalDistance]]].

TotalDistanceの各レコードのフィールドにアクセスするにはどうすればよいRoutesAndDistancesですか?

通常のリストの個々のフィールドにアクセスするには、Prologの構文を使用[First | Rest]して、目的の値に達するまでリストを剥がすようにしますが、これをリストのリストに推定する方法がわかりません...

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

2

あなたのリストはすべて正確に 2 つの要素を持っているように見えるので、次のように言えます。

list_second([_,Second], Second).

すべての距離のリストを取得するには:

maplist(list_second, Routes_distances, Distances)

ただし、すべてのリストに 2 つの要素しかないことが事前にわかっている場合、リストを使用する意味はほとんどないことに注意してください。代わりに構造体を使用することをお勧めします。たとえば、次のようになります。

RDs = [route_distance([Start,Stop1,Stop2,...,End], D1),
       route_distance([Start,Stop1,Stop2,...,End], D2)].

これははるかに読みやすいです。たとえば、あなたが示した例では、すでに1つの閉じ括弧が多すぎることに注意してください。

コードをこの表現に適応させるのは簡単です:

rd_distance(route_distance(_,D), D).

その後:

maplist(rd_distance, RDs, Ds)

Dsすべての距離のリストを表示します。

于 2013-10-26T19:25:34.647 に答える
1

その構造は、ペアのリストのリストです。member /2 は、バックトラックでリストの要素を「列挙」する簡単な方法です。次に、パターン マッチングにより、必要なフィールドを抽出できます。例えば

?- member([_,X], [[[a,b,c],2],[[d,e,f],10]]).
X = 2 ;
X = 10.
于 2013-10-26T19:32:58.480 に答える