Guest User

Untitled

a guest
Jul 16th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.07 KB | None | 0 0
  1. struct Term<'a> {
  2. arguments: Vec<Term<'a>>,
  3. symbol: &'a str,
  4. }
  5.  
  6. impl<'a> PartialEq for Term<'a> {
  7. fn eq(&self, other: &Term) -> bool {
  8. if self.symbol == other.symbol && self.arguments.len() == 0 && other.arguments.len() == 0 {
  9. return true;
  10. } else if self.symbol == other.symbol && self.arguments.len() == other.arguments.len() {
  11. for (idx, argument) in (self.arguments).iter().enumerate() {
  12. if *argument != other.arguments[idx] {
  13. return false;
  14. }
  15. }
  16. return true;
  17. }
  18. false
  19. }
  20. }
  21.  
  22. impl<'a> Term<'a> {
  23. fn new(symbol: &'a str, arguments: Vec<Term<'a>>) -> Term<'a> {
  24. Term {
  25. symbol: symbol,
  26. arguments: arguments,
  27. }
  28. }
  29.  
  30. fn is_variable(self: &Term<'a>) -> bool {
  31. self.arguments.len() == 0 && self.symbol.chars().nth(0).unwrap().is_uppercase()
  32. }
  33.  
  34. fn substitute_variable(self: &mut Term<'a>, with_term: Term<'a>) {}
  35.  
  36. // fn to_string(self : &Term<'a>) -> String {
  37. // if self.arguments.len() == 0 {
  38. // String::from(self.symbol)
  39. // } else {
  40. // let mut representation = String::new();
  41. // representation += &(self.symbol.to_owned() + "(");
  42. // for argument in self.arguments {
  43. // representation += &(argument.to_string() + ",");
  44. //
  45. // }
  46. // representation
  47. // }
  48. // }
  49. }
  50.  
  51. struct TESRule<'a> {
  52. // left_side -> right_side
  53. left_side: Term<'a>,
  54. right_side: Term<'a>,
  55. }
  56.  
  57. fn check_termination(left_side: &Term, right_side: &Term) -> bool {
  58. for arguments in left_side.arguments.iter() {
  59. if arguments == right_side {
  60. return true;
  61. }
  62. }
  63. if left_side.symbol != right_side.symbol
  64. || left_side.arguments.len() != right_side.arguments.len()
  65. {
  66. return false;
  67. }
  68. let num_sub_terms = left_side.arguments.len();
  69. for i in 0..num_sub_terms {
  70. if !check_termination(&left_side.arguments[i], &right_side.arguments[i]) {
  71. return false;
  72. }
  73. for j in 0..num_sub_terms {
  74. if i != j
  75. && !check_termination(&left_side.arguments[i], &right_side.arguments[i])
  76. && left_side.arguments[i] != right_side.arguments[i]
  77. {
  78. return false;
  79. }
  80. }
  81. return true;
  82. }
  83. false
  84. }
  85.  
  86. impl<'a> TESRule<'a> {
  87. fn new(left_side: Term<'a>, right_side: Term<'a>) -> TESRule<'a> {
  88. TESRule {
  89. left_side: left_side,
  90. right_side: right_side,
  91. }
  92. }
  93.  
  94. // fn check_termination(&self) -> bool {
  95. // for arguments in self.left_side.arguments.iter() {
  96. // if *arguments == self.right_side {
  97. // return true;
  98. // }
  99. // }
  100. // if self.left_side.symbol != self.right_side.symbol ||
  101. // self.left_side.arguments.len() != self.right_side.arguments.len() {
  102. // return false;
  103. // }
  104. // let num_sub_terms = self.left_side.arguments.len();
  105. // for i in 0..num_sub_terms {
  106. // let sub_rule = TESRule::new(self.left_side.arguments[i],self.right_side.arguments[i]);
  107. // for j in 0..num_sub_terms {
  108. // if i == j {
  109. // continue;
  110. // }
  111. // }
  112. // }
  113. // false
  114. // }
  115. }
  116.  
  117. //macro_rules! term {
  118. //
  119. //}
  120.  
  121. fn main() {
  122. let term_a = Term::new("f", vec![Term::new("X", vec![]), Term::new("a", vec![])]);
  123. println!("{}", term_a.arguments[0].is_variable());
  124. println!("{}", term_a.arguments[1].is_variable());
  125. //println!("{}",term_a.to_string());
  126. println!("{}", term_a == term_a);
  127. println!("{}", term_a == term_a.arguments[1]);
  128.  
  129. let term_b = Term::new("X", vec![]);
  130. let term_c = Term::new("f", vec![Term::new("a", vec![]), Term::new("a", vec![])]);
  131. println!("{}", check_termination(&term_a, &term_b));
  132. println!("{}", check_termination(&term_a, &term_c));
  133. }
Add Comment
Please, Sign In to add comment