2010-04-04 5 views
1

숫자의 계승을 연구하고 싶습니다. 내 계승 규칙은 Prolog 파일에 있으며 C++ 파일에 연결하고 있습니다. 누군가가 Prolog와 인터페이싱 C++의 문제점을 말해 줄 수 있습니까?프롤로그 및 C++의 팩터 리

my factorial.pl file: 

factorial(1, 1):- 
    !. 
factorial(X, Fac):- 
    X > 1, 
    Y is X - 1, 
    factorial(Y, New_Fac), 
    Fac is X * New_Fac. 



my factorial.cpp file: 

headerfiles 

term_t tf; 
term_t tx; 
term_t goal_term; 
functor_t goal_functor; 

int main(int argc, char** argv) 
{ 
    argv[0] = "libpl.dll"; 

    PL_initialise(argc, argv); 

    PlCall("consult('factorial.pl')"); 

    cout << "Enter your factorial number: "; 
    long nf; 
    cin >> nf; 

    tf = PL_new_term_ref(); 
    PL_put_integer(tf, nf); 
    tx = PL_new_term_ref(); 

    goal_term = PL_new_term_ref(); 
    goal_functor = PL_new_functor(PL_new_atom("factorial"), 2); 
    rval = PL_cons_functor(goal_term, goal_functor, tf, tx); 

    PL_halt(PL_toplevel() ? 0 : 1); 
} 

마지막 줄의 프롤로그 프롬프트가 나타납니다. 그러나 다음과 같은 계승 계산의 결과를 얻지 못합니다.

?- factorial(5, X). 
X = 120 
true 

무엇이 누락 되었습니까?

감사합니다,

+0

무엇이 오류입니까? –

+0

사소한 점 : 자르기 연산자를 사용할 필요가 없다고 생각합니다. '계승 (1,1)'이라고 쓰십시오. (내 프롤로그는 매우 녹슬고 잘못하면 사과합니다.) –

+1

일어날 것으로 예상되는 것, 실제로 일어나고있는 것, 그리고 후자가 이전과 다른 것을 설명해야합니다 . 나는 Jon Skeet을 제외하고는 SO의 구성원들에게 ESP가 없다고 감히 이야기합니다. –

답변

1
# include files 

term_t tf; 
term_t tx; 
term_t goal_term; 
functor_t goal_functor; 

int main(int argc, char** argv) 
{ 
    argv[0] = "libpl.dll"; 
    PL_initialise(argc, argv); 

    PlCall("consult(swi('plwin.rc'))"); 
    PlCall("consult('factorial.pl')"); 

    cout << " Enter your factorial number: "; 
    long nf; 
    cin >> nf; 

    tf = PL_new_term_ref(); 
    PL_put_integer(tf, nf); 
    tx = PL_new_term_ref(); 
    goal_term = PL_new_term_ref(); 
    goal_functor = PL_new_functor(PL_new_atom("factorial"), 2); 
    PL_cons_functor(goal_term, goal_functor, tf, tx); 

    int fact; 
    if(PL_call(goal_term, NULL)) 
     { 
      PL_get_integer(tx, &fact); 
      cout << fact << endl; 
     } 
    else 
     { 
      PL_fail; 
     } 

    PL_halt(PL_toplevel() ? 0 : 1); 
} 
1

나는 모든 SWI 프롤로그 - C/C++ 다리가 익숙하지 해요,하지만 당신이 용어를 정의하면 쿼리를 시작하지 않는 것으로 보인다. PL_call 또는 PL_open_query을 사용한 다음 결과를 인쇄하여 SWI-Prolog로 전달해야합니다.

PL_cons_functor(goal_term, goal_functor, tf, tx); 
int nfactorial; 
if (PL_call(goal_term, NULL)) { 
    PL_get_integer(tx, &nfactorial); 
    std::cout << "X = " << nfactorial << " ." << std::endl; 
} else { 
    PL_fail; 
} 
    PL_halt(PL_toplevel() ? 0 : 1); 

최상위 쿼리로 goal_term을 설정할 수 있는지 잘 모르겠습니다. PL_toplevel에 대한 호출로 쿼리를 실행하려면 쿼리를 문자열로 작성한 다음 인수 벡터의 "-t"인수로 PL_initialize으로 전달할 수 있습니다.

+0

고마워요. 그것은 작동합니다! 건배, – Joshua

관련 문제