backtracking.ncd 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. process main {
  2. value({}) list;
  3. var("0") i;
  4. backtrack_point() point;
  5. num_lesser(i, "100") do_more;
  6. If (do_more) {
  7. list->insert(i);
  8. num_add(i, "1") new_i;
  9. i->set(new_i);
  10. point->go();
  11. };
  12. val_equal(list.length, "100") a;
  13. assert(a);
  14. value({}) list;
  15. var("0") i;
  16. blocker() blk;
  17. blk->up();
  18. blk->use();
  19. num_lesser(i, "100") do_more;
  20. If (do_more) {
  21. list->insert(i);
  22. num_add(i, "1") new_i;
  23. i->set(new_i);
  24. blk->downup();
  25. };
  26. val_equal(list.length, "100") a;
  27. assert(a);
  28. var("true") start;
  29. var("false") flag;
  30. backtrack_point() point;
  31. If (start) {
  32. blocker() blk;
  33. blk->up();
  34. spawn("helper1", {});
  35. imperative("<none>", {}, "helper3", {}, "1000");
  36. start->set("false");
  37. blk->down();
  38. if("false");
  39. } Else {
  40. assert(flag);
  41. };
  42. exit("0");
  43. }
  44. template helper1 {
  45. _caller.blk->use();
  46. imperative("<none>", {}, "helper2", {}, "1000");
  47. _caller.point->rgo();
  48. }
  49. template helper2 {
  50. val_equal(_caller._caller.flag, "true") a;
  51. assert(a);
  52. }
  53. template helper3 {
  54. val_equal(_caller.flag, "false") a;
  55. assert(a);
  56. _caller.flag->set("true");
  57. }