Search code examples
visual-studio-2008swi-prologfactorial

Factorial in Prolog and C++


I would like to work out a number's factorial. My factorial rule is in a Prolog file and I am connecting it to a C++ file. Can someone please tell me what is wrong with my interfacing C++ to Prolog?

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 );
}

I get the Prolog prompt, which is what the last line does. But I don't get the result of the factorial calculation, such as:

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

What am I missing?

Thanks,


Solution

  • # 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 );
    }