2017-01-17 10 views
1

현재 레일 라인 프로그램을 작성하고 있지만 사실에서 나온 목록을 사용하는 데 약간의 문제가 있습니다. 나는 다음과 같은 사실과 규칙을 프롤로그 아주 새로운 오전과 지금까지 쓴 : 규칙이 두 위치 공통점이있는 라인 (들)의 이름을 반환하는프롤로그 규칙의 사실 목록에서 목록 사용

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

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

생각입니다. 이것은 hasCommonLine(warwickAvenue,paddington,Line).을 시도하면 작동하지만 hasCommonLine(euston,warrenStreet,Line).을 시도하면 false를 반환합니다.

이 규칙은 목록의 첫 번째 요소 만 검사하기 때문에 목록의 모든 요소를 ​​검사하는 대신 [northernLine][victoriaLine]을 비교하기 때문입니다. 이 일을 성취하기위한 모든 지침은 많은 도움이 될 것입니다!

답변

2

당신은 확인하실 수 있습니다 Line이 두 목록의 구성원 인 경우 :

hasCommonLine(Location1, Location2, Line) :- 
    location(Location1, Lines1), 
    location(Location2, Lines2), 
    member(Line, Lines1), 
    member(Line, Lines2). 
0 두 위치 사이의 공통의 모든 라인을 찾을 필요가있는 경우

그런 다음, 당신은 단순히

?- findall(X, hasCommonLine(euston, warrenStreet, X), Y). 
Y = [northernLine]. 
1

규칙을 개선해야합니다.
지금은 두 위치에 정확히 행 목록 인 이 있는지 확인합니다.

해야 할 일은 둘 사이에 겹침이 있는지 확인하는 규칙을 만드는 것입니다. 두리스트의 교차를 검사하는 술어를 사용할 수 있습니다.

그것은 다음과 같이 보일 것입니다 :

hasCommonLine(Location1,Location2, CommonLines):- 
    location(Location1,Line1), 
    location(Location2,Line2), 
    intersection(Line1,Line2,CommonLines). 
2

내가 규칙은 목록의 첫 번째 요소를 확인하기 때문에이 용의자.

아니요, 프로그램은 두 개의 목록이 동일하다는 것을 확인합니다.. 따라서 둘 모두가 Line과 완전히 일치하면 (동일한 요소, 동일한 순서) 일치합니다.

목록을 사용하여 회선 목록을 지정하는 것은 다소 비 -Prolog입니다.

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

그래서 여기 warrenStreet 두 번 발생합니다 : 보통 그들은 같은 사실의 목록으로 표현 한 번 victoriaLine에 한번 와 함께. 그럼 당신은 간단하게 작성할 수

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

를 부를 것이다 나는 운동이기 때문에 그들이리스트로 지정 같은데요. 다음 연습은 "20 행 추가"일 것입니다. –

+0

@ S.L.Barth이게 어떻게 문제가되는지도 모르겠다. ... –

+0

나의 의심을 바로 잡고 유익한 답변을 해주셔서 감사합니다.:) – LamarTheLizard