The Halting Problem: The Unsolvable Problem

Поделиться
HTML-код
  • Опубликовано: 7 фев 2025
  • One of the most influential problems and proofs in computer science, first introduced and proved impossible to solve by Alan Turing. The video provides the idea of this incredibly clever proof. I highly recommend anyone who is comfortable with mathematical proofs to read the formal proof to the problem (look at additional resources below for information).
    Also, the video does not cover this, but the significance of this unsolvable problem cannot be understated. By logically proving that the Halting Problem is impossible to solve, this means that there is an entire class of problems that can never be solved through computing (i.e. undecidable problems). For example, the Halting Problem tells us that it is impossible to come up with a general algorithm/program/machine that tells us if another algorithm/program/machine will ever halt. This means it would be impossible to come up with an algorithm that does something as simple as determine if a program only prints "A". This is because we can reduce the problem of determining whether a program halts to the problem of determining whether a program prints “A”: Take the description of the original program and change every exit/return statement to a “print A” statement. The new program prints “A” precisely if the original program halts, and being able to determine if the program prints "A" would mean we can determine if the program halts and, therefore, solving the Halting Problem. However, as Turing had proved, the Halting Problem is unsolvable, an algorithm that determines if another algorithm halts cannot exist; what more determine if a program prints something?
    ___________________________________________________________
    Additional resources to understand this INCREDIBLE PROOF:
    Turing, A.M. (1937), On Computable Numbers, with an Application to the Entscheidungsproblem. Proceedings of the London Mathematical Society, s2-42: 230-265. doi:doi.org/10.111...
    Alan Turing's original paper and proof to the Halting Problem. This is also the paper where he first introduced the idea of Turing Machines. It might be interesting to note he did not call it the Halting Problem in this paper. In fact, it wasn't until a later paper that the term 'halting problem' was introduced.
    Michael Sipser. 2006. Introduction to the Theory of Computation (2nd. ed.). International Thomson Publishing.
    The main source of my Theory of Computation knowledge (a textbook). Read Chapter 4.2: Undecidability to learn about the diagonalization technique used in this proof, and to see a more formal proof.
    Hodges, Andrew, "Alan Turing", The Stanford Encyclopedia of Philosophy (Winter 2019 Edition), Edward N. Zalta (ed.), plato.stanford....
    To read more about Alan Turing and his ideas!
    ___________________________________________________________
    And as always, this video project could not have been done without the support and guidance of Audrey St. John at Mount Holyoke College, a truly incredible professor-mentor-human.

Комментарии • 454

  • @NeerajSharma-rf2ev
    @NeerajSharma-rf2ev 4 года назад +369

    Easiest explanation I have ever seen... really awesome!

    • @flo0778
      @flo0778 7 месяцев назад +2

      because its wrong luls

    • @iamamaze8790
      @iamamaze8790 7 месяцев назад +1

      @@flo0778 wdym

    • @flo0778
      @flo0778 7 месяцев назад +2

      @@iamamaze8790 D is a computable function it takes an input x and then you can compute D(x) (potentially for ever).
      H can say if a computation will run forever.
      At 2:11. H decides if D weather D will halt or continue forever. But this makes no sense because D is a function. It needs an argument to be a program. It makes no sense to say "it holds" or "it continues forever" for a function : it could depend on the argument.
      This proof just proves that there is no algorithm that can say if a function D will stop or halt for all arguments. Which was trivial to prove : such a H cannot work for a function that stops or doesn't stop depending on the argument (example f(x : boolean) = while(x) {}).
      The real proof actually proves that there is no computable function H that can say if a program will halt; it uses a clever trick with the arguments of function D and function H. check any other video.

    • @TypicWhisper
      @TypicWhisper Месяц назад

      @flo0778
      It only omitted that D is both the input function and argument to H, as in:
      D(f) = Opposite(H(f,f))
      where H(f,g) determines if f halts given g.
      when applied:
      D(D) = Opposite(H(D,D))
      Whether D(D) halts or not creates a contradiction as H states the opposite.

  • @roxferesr
    @roxferesr Год назад +71

    This explanation is AMAZING! Most other videos feel like the author doesn't really know they problem themselves. Thanks I finally got it

  • @johndebord7802
    @johndebord7802 4 года назад +39

    This is the best explanation of the halting problem on RUclips by far

  • @pslaw
    @pslaw 3 года назад +77

    Thank you so much for the clear explanation 🙏 I've watched countless clips about the halting problems, but never got to wrap my head around it. You did an awesome job at explaining in four minutes 👍 Please make more videos about computing, not the coding but the math behind it.

  • @L99BAN
    @L99BAN 3 года назад +41

    I feel as though this video filled the gaps in my misunderstanding. So clear! Thank you so much

  • @jordanjohn01
    @jordanjohn01 3 года назад +10

    Ive literally watched 10 other vids on the halting problem, and this is the only one that made sense. TY

  • @shadmantabib5014
    @shadmantabib5014 Год назад +2

    This is one of the best intuitive channels for one to learn basics of fundamental computer science problems

  • @bisheshshrestha2740
    @bisheshshrestha2740 Год назад +12

    I am preparing for my Automata exam. I've been struggling understanding the Halting problem this whole time. Your video was so precise and easy to understand. Keep up the good work!

  • @karanmunjani3256
    @karanmunjani3256 3 года назад +7

    WOW!!! I just got ton of conceptual knowledge of TOC in detail with all the kind of theories involved inside it. Bunch of thanks to you Lydia Cheah!!!

  • @nuton9706
    @nuton9706 Год назад +4

    Your explanation and animation help me to understand the Halting Problem! Thank you so much for such great video and please keep up the good work!

  • @HiJackLeeLee
    @HiJackLeeLee 3 года назад +20

    I believe this is the most easy-to-understand explanation and cutest animation about Halting Promble that I can find on RUclips.
    Appreciate.

  • @kopanhagen668
    @kopanhagen668 9 месяцев назад +4

    It's so brilliantly explained, it really makes you think-why didn’t I get this sooner?

  • @azzarox6661
    @azzarox6661 Месяц назад

    Been a long time since I studied this, it's so useful. For those who need this too:
    The Halting Problem also disproves the Eintscheidungsproblem.
    The Eintscheidungsproblem asks for a program that can answer True or False when given a logical statement.
    Say our logical statement is whether a program will halt (aka the Halting Problem)
    so we have two instances of D, D1 and D2, with an instance of H each, H1 and H2
    pass D2 into D1. If H1 determines D2 halts, then D1 will continue forever. If H1 determines D2 runs forever, then D1 will halt.
    This is a contradiction, thus H can't exist.
    This also means that if we fed this into the Eintscheidungsproblem it wouldn't be able to answer it, thus E (the algorithm to solve the Eintscheidungsproblem) also can't exist.

  • @dsareis9134
    @dsareis9134 3 года назад +13

    Your explanation were quite clear, understandable and enjoyable, thank you

    • @dsareis9134
      @dsareis9134 3 года назад

      I enjoyed all the videos I watched on your channels

  • @MATHONG
    @MATHONG 2 года назад +1

    I'm Korean. It's informative, cute, and informative. Thanks to you, I understood it first. This was the most important task.

  • @breathemath4757
    @breathemath4757 4 года назад +2

    This deserves one million more views. Thank you.

  • @miguelsr4272
    @miguelsr4272 3 года назад +2

    Thank you very much for this video. It's the first video I've seen that explain the problem with such simplicity

  • @reemaj2482
    @reemaj2482 Месяц назад

    GIRL THANK YOU! I‘m writing my final exam this friday and I‘ve been struggling with this topic for tooooo looooong! You really helped me here. Wish you an amazing year! THANKS again ❤

    • @offeibekoe452
      @offeibekoe452 Месяц назад

      This explanation is wrong 🙏😭

    • @reemaj2482
      @reemaj2482 Месяц назад

      @offeibekoe452 which part is incorrect? 😭🙏

    • @reemaj2482
      @reemaj2482 Месяц назад

      @@offeibekoe452 please explain🙏🙏🙏

  • @Nitin-_-_-_-_-_-_-00971
    @Nitin-_-_-_-_-_-_-00971 3 года назад +6

    The most easiest explanation on YT.❤️❤️
    I subscribed.

  • @BenM2291
    @BenM2291 Год назад

    Needed to quickly get a grasp on this for my dissertation. Definitely would've taken a long time if researched elsewhere. Thanks for the quick explanation

  • @omegahaileyesus
    @omegahaileyesus 4 года назад +1

    Easily the best explanation I’ve seen

  • @kid_kulafu_1727
    @kid_kulafu_1727 4 года назад +3

    you definitely needs more subscriber. simple explanation. I easily got it. thank you! can you explain Turing complete and state machines?

  • @amritborah2773
    @amritborah2773 2 года назад +1

    Brilliant animation and vocal skills. Much Thanks & Love :)

  • @tejas.873
    @tejas.873 3 месяца назад

    Wow this was the simplest yet most interesting and helpful video explanation!!

  • @Ms_Ink
    @Ms_Ink 2 года назад +1

    Thank you so much!! I’ve watched quite a few videos about this but this one really made sense!

  • @_yomiadebowale
    @_yomiadebowale 3 года назад

    This person has to be the best teacher ever!

  • @aavashkuikel1341
    @aavashkuikel1341 9 месяцев назад

    Awesome explanation. Short and concise! Love from Louisiana, USA.

  • @Ananyalatchupatula
    @Ananyalatchupatula Год назад

    thank you so much i did not understand this halting problem in other programs but now it is pretty clear.

  • @illyushen9856
    @illyushen9856 3 года назад +22

    Why did ye stop making videos

  • @bertansadiki6794
    @bertansadiki6794 Год назад +2

    job interviews be like:
    Hmmm, it seems you dont understand the hard problems. Lets go with something easier. Write an algorithm that solves the halting problem in O(1) time!

    • @paulblart7378
      @paulblart7378 Год назад +1

      Probably missed your joke, but that's really easy. Here's the program:
      print("It's not possible")

  • @unnatip2302
    @unnatip2302 Год назад

    really really amazing explanation , i had problem understanding this topic but now it is clear ! i am gonna recommend this channel to my friends . Keep posting more :D

  • @kumardevada8567
    @kumardevada8567 Год назад

    This video is really awesome , it gave me the clarity of the proof of this halting problem, I really appreciate the work, thank you so much bro...

  • @breezyx976
    @breezyx976 Год назад

    Finally understand this! Thanks for the video, shame the channel is dead because the voice and animation are both awesome.

  • @AkikoHaruki-i5o
    @AkikoHaruki-i5o 2 месяца назад

    I wondered if was dumb after watching the other videos and going “huh??” each time. I think I’m grasping it a bit better with yours. Thank you so much!!

    • @paulblart7378
      @paulblart7378 2 месяца назад

      I don't like any of these visual proofs on youtube. I think the formal mathematical proof is much easier to understand.

    • @offeibekoe452
      @offeibekoe452 Месяц назад

      Because this is wrong

    • @paulblart7378
      @paulblart7378 Месяц назад

      @@offeibekoe452 It's not wrong. Just confusing

  • @shadmimhasansifat187
    @shadmimhasansifat187 4 года назад

    I have watched many videos (many halting machines) around RUclips..
    But your cute machine's just made me understood the problem..
    Thanks a ton...
    I really appreciate...
    Oh God thanks 😇

  • @sahaneakanayaka3394
    @sahaneakanayaka3394 Год назад

    Finally understood after watching tons of videos.... Thank you very much 🙏🙏

  • @maxpoweroverdrive
    @maxpoweroverdrive 2 года назад

    this is a kind of explanation for those people who are curious and want to learn for their own knowledge; this is not for those people who are studying the night before exam.

  • @saichaithrik7134
    @saichaithrik7134 Год назад

    One of the greatest explanations ever thanks for the video

  • @thecsmedic
    @thecsmedic Год назад

    3 years later and this is making things soo understandable

  • @noname60605
    @noname60605 Год назад

    This is the best explanation. Now I understood the concept clearly.Thanks a lot❤❤

  • @AbdoulieTamba
    @AbdoulieTamba Год назад

    Easiest explanation I've seen so far.

  • @mastadodo
    @mastadodo 4 года назад +11

    Simple and intuitive explanation, thank you very much!

  • @HGGdragon
    @HGGdragon 4 года назад +22

    I somehow misread the title as "The Hailing Problem" and therefore thought the guy on the thumbnail was Hitler.... I was mildly confused.

    • @BeautyMarkRush
      @BeautyMarkRush 4 года назад +1

      Henceforth I'll be referring to him as "Adam" Turing.

    • @billyberrington
      @billyberrington 3 года назад +2

      The author likes to repeat that H is always right so...

  • @Spacexioms
    @Spacexioms 3 года назад +2

    Best explanation ever, thank you.

  • @JessicaReginadosSantos
    @JessicaReginadosSantos 3 месяца назад

    BEST FREAKIN' EXPLENATION IN THE WORLD, THANK YOU SO SO SO MUCH

  • @vijaykumar-cz7ot
    @vijaykumar-cz7ot 6 месяцев назад

    How is this still free ?
    Damn this is some high quality educational playlist

  • @TheoriaPraxisPoiesis
    @TheoriaPraxisPoiesis 2 года назад

    Thank you for this, excellent explanation, I actually understand the issue now!

  • @ShaheenSultana-p9p
    @ShaheenSultana-p9p 11 месяцев назад +1

    I like❤this halting problem ,thanks🌹🙏❤ for creating this video 🎥 I enjoyed😊😂and cartoons are so cute I like it ❤. And getting halting problem knowledge📚 very easily.
    Thank you❤.......

  • @mshahidur
    @mshahidur Год назад

    Proof of "everything can be explained". Awesome!

  • @Noobnuker1
    @Noobnuker1 2 года назад

    thank you for this, I dont know why i needed to or wanted to learn this, but Now I somewhat understand it. However everything else involved in this I dont understand.

  • @dishendra.
    @dishendra. Год назад

    short, precise, easy to understand !

  • @BoazNahumPlus
    @BoazNahumPlus 2 года назад

    Awesome video. This should be used in lessons.
    Love it!

  • @MuhammadAbdullah-qi1of
    @MuhammadAbdullah-qi1of 2 года назад

    Tomorrow is my semester examination
    Thank you to your whole team 😭❤️

  • @byzantinegold
    @byzantinegold 3 года назад +1

    Wow. This a such a good video, and I’m only half way through.

  • @NeerajSingh-or9hd
    @NeerajSingh-or9hd Год назад

    Crystal clear explanation.

  • @UTubeLion
    @UTubeLion 4 года назад

    First video that explained it so I can understand it! :)

  • @tunaylmaz7405
    @tunaylmaz7405 2 месяца назад

    i am watching this like 30 minutes before my quiz and what was i doing love it so much easier

  • @shogunrua1040
    @shogunrua1040 11 месяцев назад

    Thank you! I finally understood what it means.

  • @diegomeza6160
    @diegomeza6160 3 года назад

    Beautiful!! Keep making videos!! Mabe one explaining the Entscheidungsproblem or Type theory would be great!

  • @raphulali8937
    @raphulali8937 3 года назад

    why you so less suscriber 😐she deserves more

  • @saakshimalhotra3926
    @saakshimalhotra3926 2 года назад

    Best explanation of this problem

  • @didi_d_vil
    @didi_d_vil 4 года назад +4

    Thank you for your explanation, it was really easy to catch on, the best I saw. I have one question for you though, it is probably stupid because I have no programming knowledge, why is the program D programmed to do the opposite of what H says?

    • @nicogovindsamy9022
      @nicogovindsamy9022 3 года назад +1

      I think the purpose of creating the program D that does the opposite of H is to make this proof, i.e. to show that the program H cannot exist. Using this program D doesn't affect the initial assumption because you should be able to design this program D since it is possible, and D can be used as input into itself since D itself is also a program.

    • @gloverelaxis
      @gloverelaxis 2 года назад +1

      we've deliberately designed D *just* for the purpose of using it to prove something about how H works. I'm not sure how Alan Turing figured out (or guessed) that this particular behaviour (negating H) would be useful for proving H can't exist - that kind of creativity is the hard part of coming up with formal proofs, after all!

  • @rishipoonia7374
    @rishipoonia7374 3 года назад +1

    Great explanation, good job!

  • @rajkamalingle9144
    @rajkamalingle9144 3 года назад

    Best Explanation hands down!!

  • @dmfh5646
    @dmfh5646 Год назад

    Amazing explanation. Thank you!

  • @olgermannik1830
    @olgermannik1830 Год назад +8

    The function H, as per your description, is meant to take in two arguments: a program (or function) P and an input i for that program. It doesn't assume that P has no arguments. The function H(P, i) would then return true if P(i) halts (returns a result after a finite number of steps) and false if P(i) loops indefinitely.
    Here's a more precise sketch of the halting problem:
    """
    def H(P, i):
    """
    H is a hypothetical function that determines whether program P halts on input i.
    Returns True if P halts on i, and False if P runs forever on i.
    """
    raise NotImplementedError
    def D(P):
    if H(P, P):
    while True:
    pass # Loop indefinitely.
    else:
    return # Halt.
    # Now consider D(D). There are two cases:
    #case1:
    # If H(D, D)==False then, by definition of D, D(D) must halt.
    # But if H(D, D)==False then, by definition of H, D(D) must never halt.
    #case2:
    # H(D,D)==True , then by the definition of D, D(D) must never halt.
    # But if H(D, D)==True, then, by definition of H, D(D) must halt.
    # In either case, we have a contradiction.
    """
    This is a contradiction, which means our initial assumption that function H can exist must be wrong. Therefore, no such function H can exist that accurately determines whether arbitrary programs halt on all inputs. This is the essence of the Halting Problem, and it also implies that there's no algorithm that can determine whether any arbitrary first-order logic formula is satisfiable.

    • @grevel1376
      @grevel1376 8 месяцев назад

      you just rewrote what she said

    • @olgermannik1830
      @olgermannik1830 8 месяцев назад

      @@grevel1376
      """
      def A(x):
      #A is a hypotetical function that returns its argument called with itself as its argument.
      return not x(x)
      #from definition of A: A(A)==not A(A)
      #it is a contadiction.
      #Therefore function that determines what does its argument return, if called with itself as its argument, does not exist.
      print(A(A))#never returns.
      """

  • @neerajshah7781
    @neerajshah7781 Год назад

    Omg this video is best! Love the way u explained! ❤❤😊

  • @meganbytes7650
    @meganbytes7650 Год назад

    Thanks for the help. It's really help me to understand more. Very good animation, I really like this.🤖

  • @dumitruluca3571
    @dumitruluca3571 2 месяца назад

    great explanation

  • @Kraboobee
    @Kraboobee 7 месяцев назад

    I feel so bad for the sad H :( thanks for the great explanations!

  • @jorandebraekeleer7557
    @jorandebraekeleer7557 4 года назад

    Very nice explanation & animation!

  • @-ChiragP
    @-ChiragP 2 года назад

    Finally understood this thank you so much

  • @shaikingtroy
    @shaikingtroy Месяц назад

    Great explanation. My only problem is why does this problem exist? Like wouldn’t a machine be able to return a third option, such as a 0, saying that the algorithm is itself? It would be a simple check, assuming the whole concept of seeing if an algorithm will halt or not is not too complicated. Idk this seems dumb

  • @Anders01
    @Anders01 Год назад

    But what if a H* program is defined with the additional constraint that it only works as a standalone program? H* determines whether a program halts or not and when feeding H* to itself it says that it halts.

    • @paulblart7378
      @paulblart7378 2 месяца назад

      That makes no difference. It doesn't matter where H is called from, its output for a certain input is always the same. This is why I don't like these visual explanations, they make things like this confusing. The formal mathematical proof is the simplest way to understand it, in my opinion.

    • @Anders01
      @Anders01 2 месяца назад

      @@paulblart7378 Then what if H(P, I) is modified with the additional constraint if(P == I) return undefined? Maybe that's cheating haha, because H is then no longer universal and can in its modified form return truth, false and undefined, but anyway.

    • @paulblart7378
      @paulblart7378 2 месяца назад

      @@Anders01 A program cannot halt "undefined". It would either halt or not. There is no other option. If H makes it so that a program must halt "undefined" for H to always be right, then there's a paradox, therefore H cannot exist. The main issue is that H must be right about EVERY possible program, which includes programs composed of H.

    • @Anders01
      @Anders01 2 месяца назад

      @@paulblart7378 Yes, the addition of if(P == I) return undefined relaxes the universal requirement. But I think of as similar to the Regularity Axiom in set theory. It removes self-reference.

    • @paulblart7378
      @paulblart7378 2 месяца назад +1

      @@Anders01 True... I guess you could make an H that works for all programs that don't consist of H. Not sure if that's necessarily proven though.

  • @shivanggarg2270
    @shivanggarg2270 2 месяца назад

    this was awesome genuinely

  • @Sydrooo
    @Sydrooo 3 года назад

    Fantastic video and amazing visuals!!! :D

  • @darshanpoudel3125
    @darshanpoudel3125 5 месяцев назад

    Great Explanation ✨

    • @paulblart7378
      @paulblart7378 3 месяца назад +1

      It really isn't... look how many people in the comments are confused. The formal mathematical proof is simpler to understand than any of these weird visual explanations.

  • @saikoushik4064
    @saikoushik4064 10 месяцев назад

    Easiest and Cute explanation

  • @dariy1999
    @dariy1999 Год назад

    Really good explanation

  • @Fury_42
    @Fury_42 2 года назад

    beautifully explained, thank you!

  • @daleraz3506
    @daleraz3506 2 года назад

    Very cute channel btw.
    I've been studying AI for almost two years and will definitely recommend your channel to all new cs students (:

  • @Fine-py3tc
    @Fine-py3tc 7 месяцев назад

    H needs 2 inputs (since whether a program halts is dependent on the input). Since H needs 2 inputs, D needs 2 inputs as well (to accurately simulate H). Simply giving D D as input is invalid. running D(D, D) implies simulating D(D, )(invalid input).
    Also treating running forever and halting as booleans that can contradict is an arbitrary choice.

    • @paulblart7378
      @paulblart7378 5 месяцев назад

      I'll admit that this video's explanation could have been a lot better but the proof is still there.

  • @zexceed65
    @zexceed65 3 года назад

    great audio and video representation

  • @sahilghuge5302
    @sahilghuge5302 2 месяца назад

    OMG loved your video!! thanks a lot

  • @arthursouza420
    @arthursouza420 2 года назад

    its like asking a liar if he is telling the truth, but instead asking a liar if another liar is lying. it will never work, and you can use this rethorical juggle to disprove anything. thats precisely the difference between sophism philosophy and science.

  • @jeevansch.5599
    @jeevansch.5599 3 года назад

    This is so good
    Best content in my opinion

  • @muhammedgold3
    @muhammedgold3 2 года назад

    this is an awesome explanation, thanks :)

  • @Jose-yt3qz
    @Jose-yt3qz 2 года назад

    The halting problem becomes apparent when you hear the word 'forever'.
    The program would run forever and never get a 'not stuck'.

  • @콘충이
    @콘충이 Месяц назад

    Thanks!

  • @masterprattu
    @masterprattu 4 года назад +1

    Great video!

  • @可惜前
    @可惜前 2 года назад

    Thank you lydia!

  • @mrityunjoynath7673
    @mrityunjoynath7673 2 года назад +6

    This is the solution to the confusion (Read this word by word you can then sleep peacefully):
    1) We know that from h we can derive h+
    2) If h+ exists then h exists
    3) And h+ returns opposite of whatever it is supposed to tell about an input
    4) We make it to contradict by inputting itself into it, now even though it’s saying the opposite of it’s input but even doing the correct thing it’s contradicting with itself!
    5) Now if h+ contradicts itself, it can’t exist and so h can’t exist!

    • @inziify
      @inziify 2 года назад

      this has to be the easiest explanation on the entire internet to the Halting Problem.

  • @umhi9778
    @umhi9778 Месяц назад

    It only got it wrong because D does the opposite of what H says after H says it, and H wasn't programmed to be able to adjust for that. If H was programmed to able to randomly pick if D should halt or not, then signal to D the opposite of what it chose in response to that program and then display its prediction for humans to see separately, practically, it would always be right.

  • @offeibekoe452
    @offeibekoe452 Месяц назад

    But D is using H's output as input? So D is running an altered version of the program H read.

  • @mohithsathyanarayanan7882
    @mohithsathyanarayanan7882 3 года назад

    Thank you

  • @adrianbermudez7005
    @adrianbermudez7005 5 месяцев назад +2

    Is basically the pinochio paradox, its the exact same thing, but with computers

  • @AakashKumar-gl2fk
    @AakashKumar-gl2fk 4 года назад

    Best explanation

  • @hennaazeez1227
    @hennaazeez1227 Год назад

    easiest explanation❤

    • @paulblart7378
      @paulblart7378 5 месяцев назад

      Also the worst. It's way too simplified

  • @sahilghuge5302
    @sahilghuge5302 2 месяца назад

    can u suggest some really good books to get notes on this topic?

  • @snipebuddy
    @snipebuddy 2 года назад +1

    very underrated