0

Prolog の単純なプログラムで問題が発生しています。私は 2 つの異なるグループを持っており、事実を直接変更せずに、あるグループの要素を別のグループに関連付けたいと考えています (例: トロント = USA)。

country(usa,    northamerica).
country(canada, northamerica).

city​​(chicago,    usa).
city​​(newyork,    usa).
city​​(losangeles, usa).
city​​(dallas,     usa).
city​​(miami,      usa).
city​​(lasvegas,   usa).
city​​(seattle,    usa).

city​​(toronto,    canada).
city​​(vancouver,  canada).
city​​(ottawa,     canada).
city​​(richmond,   canada).
city​​(winnipeg,   canada).
city​​(edmundston, canada).
city​​(hamilton,   canada).

trip(john, usa).
trip(jack, canada).

この例では、ジョンは米国の 7 つの都市を旅行し、ジャックはカナダの他の 7 つの都市を旅行しました。

しかし、ジョンは最近トロントに旅行しました。次の結果に到達したいと思います。

? - trip_plus(X, john).

X = chicago;
X = newyork;
X = losangeles;
X = dallas;
X = miami;
X = lasvegas;
X = seattle;
X = toronto;

?- yes

上記の結果を得るために何度も失敗しました。私が得ることができる最も近いものは、以下を使用することでした:

country(C).
city(Y).
trip(T).
trip_plus(X, T) :- city(Y, C), trip(T, C).

私は何を間違っていますか?

ありがとう仲間。

4

2 に答える 2

1

正しく理解できたかどうかわかりませんが、誰かが訪れたすべての都市をリストする述語を作成したいですか? 解決策を 3 つのケースに分割します。

最初に、すべての直接の「都市への旅行」を一覧表示します (例: trip(john, toronto)) trip(john, newyork)

trip_plus(City, Who) :-
  % we grab all the trip(*, *) pairs
  trip(Who, City),
  % and we leave only cities
  city(City, _).

次に、「国への旅行」のすべての都市を一覧表示します。たとえば、次のようになりtrip(john, usa)ます。

trip_plus(City, Who) :-
  % again, we grab all the trip(*, *) pairs
  trip(Who, Country),
  % and we list all cities in given country (if it is a country)
  city(City, Country).

最後に、「大陸旅行」のすべての都市を一覧表示します。たとえば、次のようになりtrip(jack, northamerica)ます。

trip_plus(City, Who) :-
  % the same thing
  trip(Who, Continent),
  % we list all countries on the continent
  country(Country, Continent),
  % and we list all cities in given country 
  city(City, Country).

述語全体は次のようになります。

trip_plus(City, Who) :-
  trip(Who, City),
  city(City, _).
trip_plus(City, Who) :-
  trip(Who, Country),
  city(City, Country).
trip_plus(City, Who) :-
  trip(Who, Continent),
  country(Country, Continent),
  city(City, Country).

したがって、世界のデータベースとそれらの旅行については次のようになります。

trip(john, usa).
trip(jack, canada).
trip(john, toronto).

我々が得る:

?- trip_plus(X, john).
X = toronto ;
X = chicago ;
X = newyork ;
X = losangeles ;
X = dallas ;
X = miami ;
X = lasvegas ;
X = seattle ;
false.

torontoエントリtrip(john, toronto)がデータベースで最後にあるのに、それが最初であることに気付くかもしれません。それは、最初に「都市へ」の旅行を探すからです。順序が重要な場合、述語は次のように記述できます。

trip_plus(City, Who) :-
  trip(Who, Where),
  (
  city(Where, _), City = Where;
  city(City, Where);
  country(Country, Where), city(City, Country)
  ).

ただし、個人的にはあまり目立たないと思います。

于 2012-07-04T10:51:01.847 に答える
0

「ジョンがトロントに旅行した」をファクト リストに追加していないため、表示されません。次のようにコードを変更できます。

%This is not needed => country(C). 

city(toronto). %here whatever city john visited
trip(john). %the person's name
trip_plus(X, T) :- trip(T,C), city(X,C) | trip(T) , city(X).
于 2012-07-04T12:30:04.903 に答える