2009-10-31 8 views
1

정렬이란 말은 술어가 두 개의리스트를 취한다는 것을 의미하며, 정렬리스트와 함께 세 개의리스트를 취한다. 그런 다음 정렬 목록의 모든 항목이 실제로 다른 목록의 요소인지 확인하십시오. 그리고 정렬에 대한 요구 사항이 있습니다. 정렬 목록의 모든 항목이 다른 입력 릿의 멤버 일 뿐이라는 것을 확인하는 규칙은 없습니다. 회원 확인 만하면 역순으로 유효한 정렬이 유효합니다. 어느 것이 잘못 되었습니까.Prolog 정렬을위한 술어

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입니다.

답변

2

정렬을 확인하는 순진한 방법은 append/3, 같은 즉, 뭔가 :

append(_, [El | T1], L1), 
append(_, [El | T2], L2), 
... 
L1L2 지정된 목록입니다

El은 공유해야한다는 요소입니다. 나중에 T1T2이 맞는지 확인할 수 있습니다.

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] 
[] 
+0

[E1 | T1] 여기서 머리를 지우지 않니? 그래서 T1과 T2는 결국 비어있을 것입니까? – Algific

+0

제거 하시겠습니까? [E1 | T1]은 목록을 하나 이상의 요소와 일치시킵니다. 변수 E1과 T1은 바인딩으로 결과를 얻습니다. 그게 다야. 힌트를 원했을 때 이것이 완벽한 해결책은 아니라는 점에 유의하십시오. 당신은 "제거"또는 "추가"부분을 직접 작성해야합니다. – Kaarel

+0

나는 미쳐 가고, 나에게 더 많은 것을 준다. 그 다음 내가 요청했다! – Algific

1

술어가 진실해야 다음 무엇

는 완벽한 솔루션입니다.

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