3

'is/2'Prolog 술어는 어떻게 구현됩니까? 내가Prolog '/ 2'술어 구현

X is 3*4 

is(X, 3*4) 

와 동등하지만, 필수 프로그램을 사용하여 구현 술어는 것을 알고? 즉, 구현은 다음 C 코드와 동일합니까?

if(uninstantiated(x)) 
{ 
    X = 3*4; 
} 
else 
{ 
    //signal an error 
} 

또는 선언적 프로그래밍 및 기타 조건부를 사용하여 구현 되었습니까?

답변

1

Prolog에 따라 다르지만 실제로 구현하면 C 또는 다른 명령형 언어로 더러운 작업이 수행됩니다. is/2의 일부는 순수한 프롤로그에서 시뮬레이션 할 수 있습니다 :

evaluate 산술 식에 대해 알고 큰 조건이다
is(X, Expr) :- 
    evaluate(Expr, Value), 
    (var(X) -> 
     X = Value 
    ; 
     X =:= Value 
    ). 

. 순수 Prolog에서도 큰 부분을 구현하는 방법이 있지만 느리고 아프다. 예 : 당신이 정수를 추가하는 조건이있는 경우, 당신은 그들뿐만 아니라 다음 (바보) 알고리즘을 사용하여 증식 할 수

evaluate(X + Y, Value) :- 
    % even this can be done in Prolog using an increment predicate, 
    % but it would take O(n) time to do n/2 + n/2. 
    add(X, Y, Value). 
evaluate(X * Y, Value) :- 
    (X == 0 -> 
     Value = 0 
    ; 
     evaluate(X + -1, X1), 
     evaluate(X1, Y, Value1), 
     evaluate(Y + Value1, Value) 
    ). 

이 중에이 보장되지 중 실제 또는 올바른; 나는 단지 산수 이 Prolog에서 구현 될 수있는 방법을 보여줄뿐입니다.

+0

감사합니다. 그리고 Prolog에서 증분 술어를 어떻게 구현할 수 있는가? (is/2 구현을 위해). 나는 그것을 보았지만 'is/2'를 사용하여 증가분의 구현만을 발견했다. Prolog가 순수 할 수 있는지 궁금해서 ("모든 것이 술어"와 같이)이 모든 것을 묻습니다. – octavian

+0

@octavian'is/2'는 술어입니다. 'is '가 두 가지 방법으로 작동해야한다는 것을 의미한다면, 일반적인 경우에 이것은 정확히 유용하지 않다는 것을 깨닫는다. (2는 1 + 1, 2는 0 + 2, 2는 4/2, 2는 sqrt이다. ...). 그러나 제약 논리 프로그래밍은 아마도 당신이 의미하는 바에 가까워집니다. –

+0

답을 좀 더주의 깊게 읽으면 정확하지 않습니다. 아마도'is/2'에 대한 예제에서 if/else는 필요하지 않을 것입니다. 대신 _Expr_을 평가하고 _X_로 통합하려고합니다. 이런 이유로'is/2'와'= : ='(산술 평등)은 같은 인수로 다른 해답을 가질 수 있습니다. –

0

Prolog의 버전에 따라 달라집니다. 예를 들어, CProlog는 C로 쓰여졌 고 (놀랄 것도없이), 모든 내장 술어는 명령형 언어로 구현됩니다.

0

Prolog는 언어 구문 분석 용으로 개발되었습니다. 그래서, 구문 분석 후

3 + - (4 * 12)/2 + 7 

같은 산술 식을 operator/3 파서의 작업을 안내하는 의미를 제공과 함께, (구문 분석 트리를 나타내는) 단지 프롤로그 용어입니다. 기본 산술 표현식의 경우 용어는

  • '-'/2입니다. 부정 (Negation)
  • '*'/2, '/'/2. 곱셈, 나눗셈
  • '+'/2, '-'/2. 덧셈, 뺄셈

'+'('+'(3 , '/'('-'('*'(4,12)) , 2)) , 7) 

'is'/2로 분석 된 샘플 표현 단순히 수행하는 같은 방법으로 RPN을, 오른쪽을 나타내는 거의 각 용어를 평가 파스 트리의 재귀 도보 (역 폴란드 표기법) 계산기가합니다. 해당 표현식이 평가되면 결과가 왼쪽에 통합됩니다.

각 기본 작업 — 덧셈, 뺄셈, 곱하기, 나눗셈 등 —은 기계어로 수행되어야하므로 하루가 끝날 때 일부 기본 작업의 결과를 계산하기 위해 일부 컴퓨터 코드 루틴이 호출됩니다 .

is/2이 전체적으로 원시 코드로 작성되었거나 대부분 프롤로그로 작성되었는지, 아니면 원시 코드로 작성된 리프 작업만으로 구현 여부가 결정됩니다.