문제

정렬함으로써 술어는 정렬 목록과 함께 3 개의 목록을 사용한다는 것을 의미합니다. 그런 다음 정렬 목록의 모든 항목이 실제로 다른 한 명이 모두 요소인지 확인하십시오. 주문에 대한 요구 사항이 있으므로 정렬 목록의 모든 항목이 다른 입력 조명의 구성원임을 확인하는 것만으로 규정합니다. 회원을 확인하면 반대로 할 때 유효한 정렬도 유효합니다. 물론 무엇이 잘못되었는지.

Example:
?- mxAli([4,2,9,8],[1,9,5,2,3,8],A).
A=[2,8] or A=[9,8]

8,2와 8,9는 여기에서 유효하지 않습니다.

한 번에 실제로 주문을 확인하는 방법에 대해 생각할 때 내 머리가 너무 필수 언어 프로그래밍으로 돌아갑니다. 모든 입력은 대단히 감사합니다. 그러나 대답을 바로주지 마십시오. 나는 내가 읽어야 할 것에 대한 힌트를 원합니다. (이 사이트에서 너무 좋은 도움을 받기 때문에 이것을 말해야합니다.

내 생각은 현재 요소의 인덱스 후에도 검색을 계속해야한다는 것입니다. 그것은 역 정렬이 유효하지 않게 만들 것입니까?

편집 : 두 목록에서 현재 요소의 인덱스 후에 검색을 계속해야합니다. 위의 예에서와 같이, 2를 찾을 때, 그것은 색인 2와 색인 5에서 다음 요소를 검색하기 시작합니다 (첫 번째 요소는 1).

도움이 되었습니까?

해결책

정렬을 확인하는 순진한 방법은 사용하는 것입니다. append/3, 즉 :

append(_, [El | T1], L1),
append(_, [El | T2], L2),
...

어디 L1 그리고 L2 주어진 목록이며 El 그들이 공유 해야하는 요소입니다. 나중에 확인할 수 있습니다 T1 그리고 T2 맞추다.

다음은 완전한 해결책입니다.

align(L1, L2, [El | T]) :-
    append(_, [El | T1], L1),
    append(_, [El | T2], L2),
    align(T1, T2, T).

align(_L1, _L2, []).

% Test, executed at consult time
:- align([4,2,9,8], [1,9,5,2,3,8], Alignment), writeln(Alignment), fail; true.

테스트는 다음과 같습니다.

[2, 8]
[2]
[9, 8]
[9]
[8]
[]

다른 팁

열쇠는 알고리즘을 너무 많이 생각하지 않고 술어가 사실이어야하는 경우를 겪는 것입니다.

여기서는 정렬 목록 (3 번째 인수)이 비어 있고 비어 있지 않다는 경우를 고려할 것입니다. 비어 있지 않은 경우의 경우 출력 목록의 첫 번째 요소에 대해 보유 해야하는 내용을 설명하고 나머지 목록의 재귀를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top