@<
은 Prolog에서 무엇을 의미하는지 알고 싶습니까? 브릿지와 토치 문제에 대해 읽는 동안 나는이 코드 줄에이 기호가 발생했습니다@<Prolog에서의 심볼
select_one_or_two(L,[Sel1,Sel2],L2) :-
select(Sel1,L,NewL),
select(Sel2,NewL,L2),
[email protected]<Sel2.
@<
은 Prolog에서 무엇을 의미하는지 알고 싶습니까? 브릿지와 토치 문제에 대해 읽는 동안 나는이 코드 줄에이 기호가 발생했습니다@<Prolog에서의 심볼
select_one_or_two(L,[Sel1,Sel2],L2) :-
select(Sel1,L,NewL),
select(Sel2,NewL,L2),
[email protected]<Sel2.
@
로 시작하는 비교 연산자를하지 않는 것보다 더 일반적인 수 있습니다. </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).`
가 (. Y
이 3
에 인스턴스화 주)이 복합 용어 (그들은 개별 원자 또는 변수 없음)입니다. 우리가 비교 규칙을 통해 보면, 일치 규칙은 다음과 같습니다
복합 용어는 먼저 인수에 대응, 그들의 펑 이름에 (알파벳 순) 그리고 마지막으로 재귀 적으로 자신의 주장에, 왼쪽에 체크 먼저 인수.
모두 용어의 는 인수에 대응 펑 이름 각각 +
*
하고있는 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 @< Y
가 2 @< 1
으로 볼이 경우
| ?- X = 2, Y = 1, X @< Y.
no
때문에 통일에 변수가 단순히 통합하는 경우 당신이 가진 것, 그래서 그것은, 그러나, 이해 2
와 X
및 1
와 Y
와 숫자 규칙 차기
. 모든 것을, 술어의 @</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.
감사합니다! 좋은 답변 :-) – parisa
약간 늦었지 만 오타입니다. '이 경우 X는 1과 함께 Y가 2로 표시되고 숫자 규칙이 시작되어 X @
narn
@narn 오타를 수정하기에는 너무 늦었습니다! 그것을 찾아 주셔서 감사합니다. – lurker