prologparse.hpp 3.2 KB

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