2012-07-03 2 views
0

프롤로그에서 간단한 프로그램에 문제가 있습니다. 저는 두 개의 다른 그룹이 있습니다. 사실을 직접 수정하지 않고 한 그룹의 요소를 다른 그룹에 첨부하고 싶습니다 (예 : 토론토 = 미국).프롤로그에서 다른 변수의 MIX 값

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

이 예에서 John은 미국의 7 개 도시로 여행했지만 Jack은 캐나다의 다른 7 개 도시를 여행했습니다.

그러나 John은 최근 토론토로 여행했습니다. 다음 결과에 도달하고 싶습니다.

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

내가 뭘 잘못하고 있니?

감사합니다.

+0

술어 트립/1은 무엇입니까? 현재 코드에서 언급되지 않았습니다. –

+0

내 질문에 작은 오타가 있습니다. * trip_plus (X, john). 하나. 토론은 여전히 ​​문제가되지 않습니다. :( 감사합니다. –

답변

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. 

당신을 그 사실을 알 수 있습니다. 입력란 trip(john, toronto)이 데이터베이스에있는 동안 toronto이 처음입니다. 그것은 우리가 처음으로 "도시로"여행을하기 때문입니다. 순서가 중요하면 다음과 같이 작성하십시오.

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

그러나 나는 개인적으로 그다지 분명한 사실을 발견하지 못합니다.

+0

답장을 보내 주셔서 감사합니다. 다른 도시 (토론토)가 검색어 검색에 두 번 등장했지만 SWI-Prolog Portable에서 두 가지 제안을 모두 확인했습니다. gprolog (Windows 용)에는 SWI와 같은 헤더에는 'USA'가없고 토론토를 제외한 미국에만 나열된 도시는 없습니다. 링크 : http://pastebin.com/vhF8NGbJ 감사합니다. –

+0

테스트 할로드중인 * .pl 파일을 첨부 할 수 있습니까? – mrhania

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

안녕하세요. 예, "John이 Toronto로 여행했다"는 사실을 추가합니다. 감사합니다. –