prologparse.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #ifndef PROLOGPARSE_HH
  2. #define PROLOGPARSE_HH
  3. #include <gprolog.h>
  4. #include <string>
  5. #include <iostream>
  6. #include <vector>
  7. #include <typeinfo>
  8. #include <cstddef>
  9. class prologparse{
  10. private:
  11. std::vector<PlTerm> gEvents;
  12. void unstack(int element){
  13. gEvents.push_back(Mk_Integer(element));
  14. }
  15. void unstack(const char* element){
  16. gEvents.push_back(Mk_String(element));
  17. }
  18. void unstack(std::string element){
  19. gEvents.push_back(Mk_String(const_cast<char*>(element.c_str())));
  20. }
  21. void unstack(float element){
  22. gEvents.push_back(Mk_Float(element));
  23. }
  24. void unstack(double element){
  25. gEvents.push_back(Mk_Float(element));
  26. }
  27. template<typename ...Values>
  28. void unstack(int element,Values... elements){
  29. gEvents.push_back(Mk_Integer(element));
  30. unstack(elements...);
  31. }
  32. template<typename ...Values>
  33. void unstack(const char* element,Values... elements){
  34. gEvents.push_back(Mk_String(element));
  35. unstack(elements...);
  36. }
  37. template<typename ...Values>
  38. void unstack(std::string element,Values... elements){
  39. gEvents.push_back(Mk_String(const_cast<char*>(element.c_str())));
  40. unstack(elements...);
  41. }
  42. template<typename ...Values>
  43. void unstack(float element,Values... elements){
  44. gEvents.push_back(Mk_Float(element));
  45. unstack(elements...);
  46. }
  47. template<typename ...Values>
  48. void unstack(double element,Values... elements){
  49. gEvents.push_back(Mk_Float(element));
  50. unstack(elements...);
  51. }
  52. public:
  53. /** \brief Void constructor
  54. *
  55. * add desc
  56. *
  57. */
  58. prologparse(){
  59. }
  60. void resetPl(){
  61. Pl_Reset_Prolog ();
  62. }
  63. int startPl(){
  64. return Start_Prolog(1, new char*());
  65. }
  66. void stopPl(){Stop_Prolog();}
  67. // /** \brief Destructor
  68. // *
  69. // * add desc
  70. // *
  71. // */
  72. ~prologparse(){
  73. }
  74. int rule(std::string name){
  75. Pl_Reset_Prolog ();
  76. PlTerm plt[1];
  77. int func;
  78. int gRes=-1;
  79. func = Find_Atom(const_cast<char*>(name.c_str()));
  80. Pl_Query_Begin(PL_FALSE);
  81. std::cout<<func<<std::endl;
  82. gRes = Pl_Query_Call(func, 1, plt);
  83. Pl_Query_End(PL_KEEP_FOR_PROLOG);
  84. if(gRes==1){
  85. std::cout<<"true"<<std::endl;
  86. }
  87. gEvents.clear();
  88. return gRes;
  89. //std::cout<<gRes << " "<<true<<std::endl;
  90. }
  91. template<typename Value,typename... Values>
  92. int rule(std::string name,Value val,Values... vals){
  93. Pl_Reset_Prolog ();
  94. unstack(val,vals...);
  95. //gEvents.push_back(Mk_Variable());
  96. PlTerm* plt=&gEvents[0];
  97. //std::cout<<gEvents.size()<<std::endl;
  98. int func;
  99. int result=-1;
  100. func = Find_Atom(const_cast<char*>(name.c_str()));
  101. //std::cout<<func<<" "<<Rd_Float(plt[0])<<std::endl;
  102. //plt[0]=1;plt[1]=1;plt[2]=1;plt[3]=1;plt[4]=1;plt[5]=1;plt[6]=1;
  103. Pl_Query_Begin(PL_FALSE);
  104. result=Pl_Query_Call(func, gEvents.size(), plt);
  105. Pl_Query_End(PL_KEEP_FOR_PROLOG);
  106. if(result==1){
  107. std::cout<<"gprolog true"<<std::endl;
  108. }else{
  109. if(result==0){
  110. std::cout<<"gprolog false"<<std::endl;
  111. }
  112. }
  113. gEvents.clear();
  114. return result;
  115. }
  116. template<typename Value>
  117. void process_one_type(){
  118. std::cout<<typeid(Value).name()<<" ";
  119. }
  120. template <typename... Values>
  121. void unpack(){
  122. int _[]={0,(process_one_type<Values>(),0)...};
  123. (void)_;
  124. std::cout<<std::endl;
  125. }
  126. };
  127. #endif // PROLOGPARSE_HH