2012-12-16 2 views
2

프롤로그 및 확실한 절 문법을 이해하려고하지만 두 문항 모두를 이해하는 데 어려움을 겪고 있습니다. 난 정말 DCG 구문을 사용하는 방법을 이해하려고매우 기초적인 dcg 프롤로그 구문

... 여기

내가 두 예제가 있습니다

첫 번째는 실제로이 포럼에 있지만 추가 질문과 다른 질문의 코드입니다 :

코드는 다음처럼 보였다 :

s --> first, operator, second. 
first --> [X]. 
operator --> ['+']. 
second --> [X]. 

을 그리고 프롤로그가이에 대해 물었을 때, 그것은 참/거짓 반환하지만 나는 삶에 대한 수 없습니다 (X, [2, +, 2], [])를 물어 보면 실제로 값을 "바인딩"하는 방법을 알아 낸다. 첫 번째 값을 반환하므로 true를 반환하는 대신 X = 2라고 말합니다.

어쨌든 실제 질문으로 돌아갑니다. 보통의 프롤로그에는 몇 가지 규칙이 있는데 이것도 그 중 하나입니다. 그것은 실제로 아무 것도하지 않으며 단순히 예제로 구성되었습니다. 나는 시도하고 DCG의 기본 문법을 이해할 수 있도록 누군가가 DCG이 번역 할 수 있다면

do(X, Y, [H|T], Sum):- 
    H == 1, %check if H is 1 
    X = H, 
    Y = T, 
    Additional is H+5, 
    Sum is Additional+Additional. 

기본적으로, 질문 있어요! 나는 약간의 튜토리얼을 읽으려고했지만 어떤 현명한 얻지 못했던 것 같은 기분이 든다. ...

답변

2

DCG : foo (A1, A2, A3, ..., An) -> bar.

프롤로그 : foo는 (A1, A2, A3, ..., AN, X, Y) : - :

s(X) --> first(X), operator, second. 
first(X) --> [X]. 
operator --> ['+']. 
second --> [X]. 
바 (X, Y)은

그래서, s로 변경해야

물론 실제 결과를 반환하는 것이 더 나을 수도 있습니다. 이 작업을 수행 할 수는 {}로 이루어집니다 DCG 절에 프롤로그 코드를 캡슐화한다 :

s(Z) --> first(X), operator, second(Y), {Z is X+Y}. 
first(X) --> [X]. 
operator --> ['+']. 
second(X) --> [X]. 

(당신이 더 많은 사업자가 있다면 당연히, 프롤로그 코드는 그렇게 간단하지 않습니다). do/4 조건에 대해서는

, 그 결과는 아래와 같습니다 :

do(X,Y,[H|T],Sum) --> 
    {H == 1, %check if H is 1 
    X = H, 
    Y = T, 
    Additional is H+5, 
    Sum is Additional+Additional}. 

하지만 당신이 원하는 왜 나는 볼 수 없습니다.

마지막 팁 하나 : DCG 조건 자에서 마지막 두 개의 인수를 추가하는 대신 phrase/3을 사용하는 것이 좋습니다.

1

do/4를 의미있는 방식으로 DCG로 번역하는 것은 쉽지 않습니다. DCF의 숨겨진 인수를 '복사'한다는 주장을 삭제했습니다.

do(Sum) --> 
    [1], %check if H is 1 
    { % braces allow 'normal' Prolog code (but we have no access to 'hidden' arguments) 
    Additional is H+5, 
    Sum is Additional+Additional 
    }. 

편집 미안해 ...

Additional is 1+5,을 읽어야, Additional is H+5,에서 H를 잊어 버렸습니다