2017-02-16 5 views
0

숫자 목록을 평가하고 [G,A],[A,B],[B,C],[C,D],[D,E],[E,F],[F,G] 패턴과 일치하는 목록을 반환하는이 코드가 있습니다. 그러나 숫자를 고유 한 숫자로만 지정하고 싶습니다. 예 : ([0,2],[2,4],[4,19],[19,3],[3,5],[5,7],[7,0]). 다른 메소드는 입력 된 숫자에 따라 true 또는 false를 반환합니다. 그러나 코드는 여전히 두 개 이상의 비슷한 숫자가있는 숫자를 반환합니다. 그들은 반복 된 숫자를 포함하기 때문에 사람들의왜 프롤로그는 False를받은 후에 되돌아 가지 않습니다?

R = [[0, 2], [2, 0], [0, 2], [2, 5], [5, 9], [9, 2], [2, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 5], [5, 23], [23, 17], [17, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 5], [5, 24], [24, 19], [19, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 5], [5, 26], [26, 12], [12, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 9], [9, 5], [5, 2], [2, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 9], [9, 15], [15, 2], [2, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 9], [9, 15], [15, 17], [17, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 9], [9, 15], [15, 19], [19, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 15], [15, 9], [9, 2], [2, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 21], [21, 1], [1, 12], [12, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 21], [21, 1], [1, 20], [20, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 21], [21, 11], [11, 12], [12, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 21], [21, 11], [11, 17], [17, 0]] ; 
R = [[0, 2], [2, 0], [0, 2], [2, 21], [21, 24], [24, 19], [19, 0]] ; 
R = [[0, 2], [2, 0], [0, 12], [12, 1], [1, 18], [18, 12], [12, 0]] ; 

없음 유효하지 :

r5(L,R):- 
    R = [[G,A],[A,B],[B,C],[C,D],[D,E],[E,F],[F,G]], 

    [A,B,C,D,E,F,G] ins 0 .. 27, 

    different([A,B,C,D,E,F,G]), 

    member([G,A],L), 
    member([A,B],L), 
    member([B,C],L), 
    member([C,D],L), 
    member([D,E],L), 
    member([E,F],L), 
    member([F,G],L), 

    label([A,B,C,D,E,F,G]). 

는 반환 어떤 부분의 예입니다.

R = [[0, 2], [2, 9], [9, 4], [4, 8], [8, 23], [23, 17], [17, 0]] ; 
R = [[0, 2], [2, 9], [9, 4], [4, 8], [8, 24], [24, 19], [19, 0]] ; 

이것은 다른 방법 : 유효 출력의 더 아래에서 두 개의 출력은 다음과 여기

different(X) :- 
    sort(X, Sorted), 
    length(X, OriginalLength), 
    length(Sorted, SortedLength), 
    OriginalLength == SortedLength. 

내 원래 호출된다

r5_3([[0, 2],[2,0],[0, 12],[12,0],[0, 17],[17,0],[0, 19],[19,0],[0, 20],[20,0],[1, 4],[4,1],[1, 12],[12,1],[1, 18],[18,1],[1, 20],[20,1],[1, 21],[21,1],[2, 5],[5,2],[9, 2],[2,9],[2, 15],[15,2],[2, 21],[21,2],[8, 3],[3,8],[10, 3],[3,10],[16, 3],[3,16],[3, 22],[22,3],[25, 3],[3,25],[8, 4],[4,8],[9, 4],[4,9],[4, 23],[23,4],[26, 4],[4,26],[9, 5],[5,9],[5, 23],[23,5],[24, 5],[5,24],[26, 5],[5,26],[14, 6],[6,14],[17, 6],[6,17],[18, 6],[6,18],[24, 6],[6,24],[25, 6],[6,25],[18, 7],[7,18],[19, 7],[7,19],[22, 7],[7,22],[23, 7],[7,23],[26, 7],[7,26],[8, 14],[14,8],[8, 23],[23,8],[8, 24],[24,8],[9, 15],[15,9],[9, 13],[13,9],[16, 10],[10,16],[10, 20],[20,10],[10, 13],[13,10],[10, 27],[27,10],[11, 12],[12,11],[17, 11],[11,17],[11, 21],[21,11],[25, 11],[11,25],[11, 27],[27,11],[18, 12],[12,18],[26, 12],[12,26],[14, 15],[15,14],[16, 14],[14,16],[26, 14],[14,26],[17, 15],[15,17],[19, 15],[15,19],[16, 20],[20,16],[16, 22],[22,16],[17, 23],[23,17],[18, 27],[27,18],[24, 19],[19,24],[19, 27],[27,19],[25, 20],[20,25],[24, 21],[21,24],[13, 21],[21,13],[25, 22],[22,25],[13, 22],[22,13],[27, 13],[13,27]],R). 
+1

을 정의? 'all_different ([A, B, C, D, E, F, G])'를 사용하십시오. – lurker

+0

"다른 방법은 입력 된 숫자에 따라 true 또는 false를 반환하지만"프롤로그는 아무 것도 반환하지 않습니다. 술어가 성공하거나 실패합니다. – Enigmativity

+1

@Enigmativity 필자는 다른 방법을 추가했다. 그러나 all_different/1 방법이 이미 존재한다면 휠을 다시 발명하는 용도는 없다. :) –

답변

3

all_different/1는 일부 CLP (FD) 라이브러리의 different/1label/1으로 전화를 걸기 전에 different/1으로 전화하는 경우에만 작동합니다.

그래서 당신도 당신의 현재 구현 all_different/1 (선호)를 사용할 수도 있고, 다음과 같이 당신은 당신의 코드를 다시 정렬 수 :

r5(L,R):- 
    R = [[G,A],[A,B],[B,C],[C,D],[D,E],[E,F],[F,G]], 

    [A,B,C,D,E,F,G] ins 0 .. 27, 

    % all_different([A,B,C,D,E,F,G]), % preferred in place of 'different/1' below 

    label([A,B,C,D,E,F,G]),   

    different([A,B,C,D,E,F,G]), 

    member([G,A],L), 
    member([A,B],L), 
    member([B,C],L), 
    member([C,D],L), 
    member([D,E],L), 
    member([E,F],L), 
    member([F,G],L). 


원래 코드에서 L의 목적은 약간 불분명하다 . 보다 일반적인 솔루션은 다음과 같이 표시 될 수 있습니다

:- use_module(library(clpfd)). 

% Define consecutive intervals consisting of Length intervals 
% with elements from 0 to MaxNumber 
consecutive_intervals(MaxNumber, Length, Intervals):- 
    length(Elements, Length),    % Establish the number of elements 
    Elements ins 0 .. Max,    % Establish the range of each element 
    all_different(Elements),    % Each element is different 
    list_intervals(Elements, Intervals), % Define consecutive intervals 
    label(Elements). 

% list_intervals(List, Intervals) 
% Intervals is a complete list of consecutive intervals with elements from List 
list_intervals([X1,X2|Xs], [[X1,X2]|T]) :- 
    list_intervals([X2|Xs], X1, T). 
list_intervals([X2], X1, [[X2,X1]]). 
list_intervals([X2,X3|Xs], X1, [[X2,X3]|T]) :- 
    list_intervals([X3|Xs], X1, T). 

솔루션의 수는 크지 만 여기에 작은, 약식 예입니다 : '다른/1`

?- consecutive_intervals(4, 3, R). 
R = [[0, 1], [1, 2], [2, 0]] ; 
R = [[0, 1], [1, 3], [3, 0]] ; 
R = [[0, 1], [1, 4], [4, 0]] ; 
R = [[0, 2], [2, 1], [1, 0]] ; 
R = [[0, 2], [2, 3], [3, 0]] ; 
R = [[0, 2], [2, 4], [4, 0]] ; 
... 
R = [[4, 3], [3, 0], [0, 4]] ; 
R = [[4, 3], [3, 1], [1, 4]] ; 
R = [[4, 3], [3, 2], [2, 4]] ; 
false. 
+1

왜이 '회원/2'목표가 있습니까? 하나의 고정 된 선택으로 충분할 것 같습니다. – false

+1

@false 나는 OP에 왜 그들이 그들이보고있는 결과를보고 있는지 설명하고있었습니다. 최적의 솔루션을 제공하려고 시도하지 않았습니다. 개선 할 기회를 얻으면 업데이트 할 것입니다. – lurker

+0

@lurker L의 목적은 0-> 27 범위에있는 쌍 중 단지 일부만 선택한다는 것입니다. 내가 비효율적으로하고 있다고 확신한다. –