Thread: Interfacing C++ and Prolog to work out factorial

  1. #1
    Registered User
    Join Date
    Mar 2010
    Posts
    26

    Interfacing C++ and Prolog to work out factorial

    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
    Code:
        factorial( 1, 1 ):-
            !.
        factorial( X, Fac ):-
            X > 1,
            Y is X - 1,
            factorial( Y, New_Fac ),
            Fac is X * New_Fac.
    my factorial.cpp
    Code:
        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,

  2. #2
    Registered User
    Join Date
    Mar 2010
    Posts
    26
    Code:
        
        # 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 );
        }

Popular pages Recent additions subscribe to a feed

Tags for this Thread