1

私は現在鉄道プログラムを書いていますが、事実に基づくリストを使用するのに少し問題があります。私は Prolog を初めて使用し、これまでに次の事実とルールを書きました。

location(euston, [northernLine]).
location(warrenStreet, [victoriaLine, northernLine]).
location(warwickAvenue, [bakerlooLine]).
location(paddington, [bakerlooLine]).

hasCommonLine(Location1, Location2, Line) :-
    location(Location1, Line),
    location(Location2, Line).

アイデアは、ルールが 2 つの場所に共通する行の名前を返すことです。これは試してみるとhasCommonLine(warwickAvenue,paddington,Line).うまくいきますが、試してみると false を返しますhasCommonLine(euston,warrenStreet,Line).

これは、ルールがリストの最初の要素のみをチェックするためであると思われます。したがって、リスト内のすべての要素をチェックするのではなく、比較のみ[northernLine][victoriaLine]行います。これを達成するためのガイダンスは大歓迎です!

4

3 に答える 3

2

これは、ルールがリストの最初の要素のみをチェックするためだと思われます。

いいえ、プログラムは2 つのリストが同一かどうかをチェックします。したがって、両方Lineの が完全に同等 (同じ要素、同じ順序) である場合にのみ、一致します。

リストを使用して行のリストを指定するのは、むしろプロローグではありません。通常、彼らはそれを次のような事実のリストとして表します:

location_new(euston,northernLine).
location_new(warrenStreet,victoriaLine).
location_new(warrenStreet,northernLine).
location_new(warwickAvenue,bakerlooLine).
location_new(paddington,bakerlooLine).

したがって、ここでwarrenStreetは 2 回発生します。1 回は でvictoriaLine、1 回は でnorthernLine。次に、次のように簡単に記述できます。

hasCommonLine(Location1, Location2, Line) :-
    location_new(Location1, Line),
    location_new(Location2, Line).

それにもかかわらず、これは当てはまらないので、ヘルパー述語を書くことができますlocation_helper/2:

location_helper(A,B) :-
    location(A,L),
    member(B,L).

次に定義します。

hasCommonLine(Location1, Location2, Line) :-
    location_helper(Location1, Line),
    location_helper(Location2, Line).
于 2017-01-17T13:53:16.323 に答える