2011-08-22 7 views
2

안녕하세요, 저는 간단한 문제가있어서 저는 프롤로그와 함께 매우 새롭다고 경고합니다. 동일한 크기의 세 개의 목록이 있다고 가정합니다. 각 목록에는 1, 0 또는 -1 만 들어 있습니다. 나는 모든 i에 대해 세 목록 중 i 번째 요소 중 하나만이 0이 아닌지 확인하고자합니다.Prolog : iteration

이 코드는 그것을 수행하는 고정 I :

:- use_module(library(clpfd)). 

compat1(V1,V2,V3,I) :- 
    length(V1,G), 
    nth1(I,V1,X), 
    nth1(I,V2,Y), 
    nth1(I,V3,Z), 
    W is X*X+Y*Y+Z*Z, 
    W is 1, 
    I in 1..G. 

어떻게 "I, compat1 (V1, V2, V3, I) ALL은"알 수 있습니까? . 나는 내가 에 관심이 있어요하지만 compat2 작동하지 않습니다 = 최대 값 K으로 호출 할 수 있도록

compat2(V1,V2,V3,1) :- compat1(V1,V2,V3,1). 
compat2(V1,V2,V3,K) :- compat2(V1,V2,V3,J), compat1(V1,V2,V3,K), K is J+1. 

을 정의하려고 : 제공 true로, 이후 ";" 무기한으로 실행됩니다.

감사합니다.

답변

2

일부 의견 : library(clpfd)(is)/2을 혼합하는 것은 좋은 생각이 아닙니다. 당신은 을 X is Y + 1 대신에 (SWI에서) 거의 동일한 효율성으로 작성할 수 있지만 그 보편성은 증가하고 있습니다.

관심있는 관계는 세 목록의 i 번째 요소와 관련이 있습니다. 즉, 다음과 같이 쓸 수 있습니다 : maplist(r, Xs, Ys, Zs) 여기서 r/3은 관심있는 관계입니다. 따라서 r(X,Y,Z)을 정의해야합니다.

abs(X)+abs(Y)+abs(Z) #= 1? 당신이 한 줄에 모두 넣을 수 있습니다 library(lambda)

:

maplist(\X^Y^Z^(abs(X)+abs(Y)+abs(Z) #= 1), Xs, Ys, Zs). 
+1

우아하고 간단합니다. 매우 유용하고, 사용하지 말라고 말해줘서 고마워/2입니다. – Martino

+1

또 다른 질문입니다. 색인과 관련된 목록의 총계는 어떻게됩니까? 예를 들어, 내가 I * A (I)라는 표현을 어떻게 요약 할 수 있습니까? – Martino

+1

이 작업을 일반적으로 수행 할 합의가 없습니다. 따라서 가장 좋은 방법은 재귀 적으로 그것을 보행자 방식으로 작성하는 것입니다. – false

0

당신은 간단한 재귀와 함께 할 수 있습니다. 프로그램은 입력을 테스트 만하고 솔루션을 생성하는 데는 사용할 수 없습니다. 필요하면 사실에 허용되는 값을 말해야합니다. 다시 읽는 당신이 정확히 하나의 항목이 0이 아닌 것을 요구 추측 질문하지 최대 한을 : 등, onlyOne(0,0,1). onlyOne(0,0,-1).

onlyOne(0,0,_). 
onlyOne(0,_,0). 
onlyOne(_,0,0). 
onlyOne([],[],[]). 
onlyOne([H1|T1],[H2|T2],[H3|T3]) :- onlyOne(H1,H2,H3), onlyOne(T1,T2,T3). 

편집을 추가하여. 이 경우 사실 대신 다음 규칙이 필요합니다.

onlyOne(0,0,X) :- X \= 0. 
onlyOne(0,X,0) :- X \= 0. 
onlyOne(X,0,0) :- X \= 0.