2014-01-24 1 views
3

@<은 Prolog에서 무엇을 의미하는지 알고 싶습니까? 브릿지와 토치 문제에 대해 읽는 동안 나는이 코드 줄에이 기호가 발생했습니다@<Prolog에서의 심볼

select_one_or_two(L,[Sel1,Sel2],L2) :- 
    select(Sel1,L,NewL), 
    select(Sel2,NewL,L2), 
    [email protected]<Sel2. 

답변

5

@로 시작하는 비교 연산자를하지 않는 것보다 더 일반적인 수 있습니다. </2과 같은 연산자를 사용하면 숫자 값 및 표현식 (숫자 값으로 인스턴스화 된 리터럴 숫자 및 변수 포함) 만 비교할 수 있습니다.

?- X = 2, Y = 3, X + Y < 2*Y. 
X = 2, 
Y = 3. 

?- X = 2, Y = 3, X + Y > 2*Y. 
false. 

?- 

그러나 표현이 알려진 숫자로 평가되지 않는 경우는 다음과 같은 경우 오류가 발생합니다 : 그래서, </2 당신이 작업을 수행 할 수 있습니다

?- Y = 3, X + Y < 2*Y. 
ERROR: </2: Arguments are not sufficiently instantiated 

또는 :

?- a < b. 
ERROR: </2: Arithmetic: `a/0' is not a function 

그러나 @</2을 사용하면 프롤로그에서 다양한 유형의 개체를 비교할 수 있습니다. 비교 평가는 @Ankur가 준 링크에 설명 된 규칙을 따릅니다.

?- a @< b. 
true. 

?- a(1) @< a(2). 
true. 

?- b(1) @< a(2). 
false. 

?- 20 @< a. 
true. 

이를 : 이러한 규칙을 이해하려면, 당신은 term, functor, atom 등으로

몇 가지 예를 보면 (Prolog Terms, 예를 들어, 참조)는, 프롤로그 용어가 무엇을 의미하는지 알아야합니다 규칙을 따르면 꽤 간단합니다. 여기에 (위에서) 더 흥미로운 경우는 다음과 같습니다 X + Y 간주되는 이유는

?- Y = 3, X + Y @< 2*Y. 
false. 

"하지 이하"2*Y? 프롤로그는 내부적으로 보는 것이 같이

`+(X,3) @< *(2,3).` 

가 (. Y3에 인스턴스화 주)이 복합 용어 (그들은 개별 원자 또는 변수 없음)입니다. 우리가 비교 규칙을 통해 보면, 일치 규칙은 다음과 같습니다

복합 용어는 먼저 인수에 대응, 그들의 이름에 (알파벳 순) 그리고 마지막으로 재귀 적으로 자신의 주장에, 왼쪽에 체크 먼저 인수.

모두 용어의 는 인수에 대응 이름 각각 +*하고있는 2이다. 그것들은 다르다. ASCII collating sequence에서 +* 뒤에옵니다. 그러므로 ++(X,3) @< *(2,3).는 따라서, Y = 3, X + Y @< 2 * Y.

참고 또한 @</2 숫자 식을 평가하지 않는 것이 사실이 아니라고 *, 따라서 사실이 아니다 "미만"사실이 아니다.그래서 심지어 X 및 값으로 인스턴스화 Y과 함께, 당신은 얻을 것이다 : 반면

?- X = 2, Y = 3, X + Y @< 2*Y. 
false. 

을, 우리가 여기 </2을했을 때,이 평가 식 X + Y < 2*Y 이후, 사실, 사실이다.

| ?- X @< Y. 

yes 

을하지만, 다른 한편으로는 : X @< Y2 @< 1으로 볼이 경우

| ?- X = 2, Y = 1, X @< Y. 

no 

때문에 통일에 변수가 단순히 통합하는 경우 당신이 가진 것, 그래서 그것은, 그러나, 이해 2X1Y와 숫자 규칙 차기

. 모든 것을, 술어의 @</2의 사용을 가졌어요 select_one_or_two은 숫자 나 완전히 인스턴스화 된 숫자식이 아닌 모든 종류의 개체 목록에서 해당 조건자를 사용할 수있게합니다.

?- select_one_or_two([2,1,3], X, Y). 
X = [2, 3], 
Y = [1] ; 
X = [1, 2], 
Y = [3] ; 
X = [1, 3], 
Y = [2] ; 
false. 

을하지만, 다음과 같은 실패 :이 </2을 사용했다면, 그 다음은 일하는 것이

?- select_one_or_two([b,a,c], X, Y). 
ERROR: </2: Arithmetic: `b/0' is not a function 
?- 

그러나, @< 연산자, 작동 :

?- select_one_or_two([b,a,c], X, Y). 
X = [b, c], 
Y = [a] ; 
X = [a, b], 
Y = [c] ; 
X = [a, c], 
Y = [b] ; 
false. 
+1

감사합니다! 좋은 답변 :-) – parisa

+0

약간 늦었지 만 오타입니다. '이 경우 X는 1과 함께 Y가 2로 표시되고 숫자 규칙이 시작되어 X @ narn

+0

@narn 오타를 수정하기에는 너무 늦었습니다! 그것을 찾아 주셔서 감사합니다. – lurker