2012-03-21 3 views
-3

행렬이 이고 인덱스가 [1,N][M,N] 인 요소의 위치를 ​​전환해야합니다.프롤로그 과제에 대한 해답을 작성하십시오

업데이트

나는 프롤로그 정말 새로운 오전, 여기 반환 내 솔루션 거짓 :(

main([FirstRow|Tail],X):- 
    last(FirstRow, A), 
    last(Tail, LastRow), 
    last(LastRow, B), 
    skipLastItem(FirstRow,FirstRowWithoutA), 
    skipLastItem(LastRow,LastRowWithoutB), 
    append(FirstRowWithoutA,[B],FirstRowNew), 
    append(LastRowWithoutB,[A],LastRowNew), 
    assign([FirstRowNew],X), 
    skipLastItem(Tail,Middle), 
    appendAllElements(Middle,X), 
    append(X,LastRowNew,X). 

appendAllElements([X|Tail],List):- 
    append(List,X,NewList), 
    appendAllElements(Tail,NewList). 

appendAllElements([],_). 

assign(Item,Item). 

skipLastItem([_],[ ]) :- !. 
skipLastItem([H|T],[H|S]) :- 
skipLastItem(T,S). 
+4

먼저 솔루션을 작성하고 문제가있는 곳을 알려주십시오. –

+2

저는 예, 누군가가 프롤로그에서 문제에 대한 해결책을 쓸 수 있다고 예측합니다. –

+0

그래서 해결책을주었습니다. 도와 주실 수 있습니까? – Eugene

답변

3

이 숙제 같은 소리, 그래서 여기에 약간 모호한 될거야 ... 목록에 하나 개의 값을 대체하는 간단한 문제와

시작합니다. 재귀 적 술어를 쓰기

swap_list(X,N,A,B,Y) 

"목록 X의 경우 N 위치에서 값 A를 제거하고 B로 바꾸면 목록 Y가됩니다."로 읽어야합니다.

이제 우리는 이것을 매트릭스의 경우까지 확장 할 수 있습니다. 제 재귀 술어 "매트릭스 A 원소 Y를 제거하고 B로 교체 위치에서 (M, N), 행렬 X에 대한 제공"으로 판독한다

swap_matrix(X,M,N,A,B,Y) 

적는다. 이 재귀의 기본 경우는 M=0이고 swap_list에 대한 호출이 포함됩니다.

지금, 당신은 다음과 같이 두 위치 (M1, N1)과 (M2, N2)를 교환 할 수 있습니다 : 우리는 매트릭스 ZB를 삽입

swap(X,M1,N1,M2,N2,Y) :- 
    swap_matrix(X,M1,N1,A,B,Z), 
    swap_matrix(Z,M2,N2,B,A,Y). 

주 우리는 심지어 그것이 무엇인지 알기도 전에 - B는 두 번째 swap_matrix 호출까지 값이 지정되지 않습니다.