2017-09-17 11 views
1

해당 목록에서 값을 비교 및 ​​검색하려고합니다. 내 술어 나는 다음과 같은 동작을 기대 correspond_elements(V1, Xs, V2, Ys)입니다 :목록 및 요소 비교

V1이 첫 번째 목록 Xs에 체크하고, Ys에서 해당 값을 반환하는 V2에 주어진
?- correspond_elements(a, [a,b,b,a], X, [1,2,3,4]). 
X = 1; 
X = 4. 

. 첫 번째 값을 가져옵니다

% checks if the argument is a list 
is_list([]). 
is_list([_|T]) :- 
    is_list(T). 

% predicate 
correspond_elements(V1, [X|Xs], V2, [Y|Ys]) :- 
    is_list([X|Xs]), 
    is_list([Y|Ys]), 
    (V1 == X -> 
     V2 is Y 
    ; 
     correspond_elements(V1, Xs, V2, Ys) 
    ). 

: 지금까지 내가 이것을 가지고

?- correspond_elements(a, [a,b,b,a], X, [1,2,3,4]). 
X = 1. 

나는 -> 절은 참이되면, ; 후 다음 아무것도 실행되지 않았 음을 알 수 있습니다. 내 코드는 X에 대해 발견 된 첫 번째 답변 만 받고 멈추는 것이 분명하지만 처음 답변을 찾은 후에도 목록을 반복 재생하고 X에 대한 모든 가능한 답변을 반환하는 방법을 알지 못합니다.

답변

1
자신을 발견으로

, 조건 A을 확인합니다 프롤로그 A -> B; C의 경우 - 당시 다른, 그리고 true 경우는 B (그리고 C)를 실행합니다. 그렇지 않으면 C (B 아님)이 실행됩니다.

그러나 Atrue 인 경우 추가 옵션으로 C을 실행하고 싶습니다. B에 대한 경비원으로 지금 A 작품 때문에

foo(Some,Parameters) :- 
    A, 
    B. 
foo(Some,Parameters) :- 
    C. 

하지만 상관없이 A 성공 또는 실패 여부, 프롤로그는 철수와 두 번째 foo/2를 실행합니다 :

foo(Some,Parameters) :- 
    A 
    -> B 
    ; C. 

로 :이 변환에 의해, 수행 할 수 있습니다 절.

우리는 (내 생각에 조금 장황)을 is_list(..) 술어를 제거 할 경우, 우리는 조건 생성 할 수 있습니다 : 우리는 여기에 조건 V1 == X를 작성할 필요가 없습니다

correspond_elements(X, [X|_], Y, [Y|_]). 
correspond_elements(V1, [_|Xs], V2, [_|Ys]) :- 
    correspond_elements(V1, Xs, V2, Ys). 

을 우리는 통일을 사용하기 때문에 이 머리. 우리는 통일을 사용하기 때문에 V1 = X (하나의 방정식 기호)이므로 더 다각적 인 방식으로 술어를 사용할 수 있음을 의미합니다.

?- correspond_elements(A, [a,b,b,a], X, [1,2,3,4]). 
A = a, 
X = 1 ; 
A = b, 
X = 2 ; 
A = b, 
X = 3 ; 
A = a, 
X = 4 ; 
false. 

가의 요소를 가져옵니다 : 모든 튜플 A와 두 목록의 X ("우편"의 일종) 쿼리

?- correspond_elements(a, [a,b,b,a], X, [1,2,3,4]). 
X = 1 ; 
X = 4 ; 
false. 

:

두 번째 목록 X의 요소를 쿼리 첫 번째 목록 :

?- correspond_elements(A, [a,b,b,a], 1, [1,2,3,4]). 
A = a ; 
false. 

1이 목록에되도록 목록 생이 :

?- correspond_elements(A, [a,b,b,a], 1, L). 
A = a, 
L = [1|_G1285] ; 
A = b, 
L = [_G1284, 1|_G1288] ; 
A = b, 
L = [_G1284, _G1287, 1|_G1291] ; 
A = a, 
L = [_G1284, _G1287, _G1290, 1|_G1294] . 
+0

감사합니다, 난 그냥 프롤로그 사고로 어려움을 겪고 있다고 생각. 이것은 많이 지 웁니다, 감사합니다 :). – RoadRunner