0

我在 Prolog 中的一个简单程序遇到了一些问题。我有两个不同的组,我想将一个组的一个元素附加到另一个组,而不直接修改事实(例如:多伦多 = 美国)。

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).

在这个例子中,约翰去了美国的七个城市,而杰克去了加拿大的其他七个城市。

然而,约翰最近去了多伦多。我想达到以下结果:

? - 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

我不确定我是否正确理解了您:您想创建一个谓词来列出某人访问过的所有城市?我会将我的解决方案分为三种情况。

首先,我们将列出所有直接“到城市旅行”,例如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 回答