Turing Machines/ Turing Completeness - turing-complete

I was reading the ethereum white paper and I came up with the term Turing-Complete. I did some research and I found out this is a whole mathematical theory. How can I start learning about Turing-Machines and Turing Completeness on a technical level. I don't care about the connection with ethereum i just want to understand the scientific part. I mean with an intro to technical level escalation. I googled this and I found general powerpoints/pdfs but that's not what I am looking for. I decided to ask here(for guidance/textbooks) cause I am pretty sure there are experts here that work on this topic. Sorry for the general-type question. I'm just a guy that loves mathematics and cryptography trying to understand how to world functions.
Kind Regards,
Nick

Related

General Advice - Robotics / AI

This is not for asking any doubts or queries. I know this is a technical forum and hence would be the best platform for me to get advice on.
I am a Master's student in computer engineering and hold interest in Robotics. I am confused as to where should I start if from. I have 2 courses one is on controlling of robots and other is based on introduction to AI. I don't want to take both the courses together. I am confused as to do I need to go for controlling of robots first or AI first?
Also, if you know any good forums/blogs on AI then please share... Would be a lot helpful.
Thanks.
AI and robot control are different subjects, and do not necesssarily cross over that much. AI covers writing software that is intelligent, and applies to things as disperate as character recognition in scanned text, stock market analysis and face detection. There are uses of AI techniques with mobile and manipulator robotics, but there are lots of good robot projects out there that are implemented with zero AI.
Your control course for robotics will likely cover the basics of kinematics and dynamics of robots, path planning, and cover a fair bit of practical robotics knowledge. All of this course is important knowlege for building and controlling robots, and if robotics is your goal destination then i would take this course. You can do good work in the robotics field with zero knowlege of AI, but you cant with zero knowlege of robot control.
Well, I would take the AI class first, because I would want to know more about the logic before going to the control part.
As far as forums go, you could check out the AI Forum, and the AI Depot (the AI Depot is not exactly a forum, but it has some good resources and articles).
You can also check out these Area51 StackExchange site proposals:
Cognitive Science
Robotics Research
Machine Learning

Where can I find programs for practicing C and assembler(IA32)?

I have learnt C and Assembly(IA32) on Linux and I will also be learning a few more languages this year.
I want to make my fundamentals strong and for that I need some tips from you guys as in, where will I find programs for practice? so that I solve them and get more and more experience.
Any good web links that would help a novice programmer to improve and be confident about the language he/she is learning.
I try looking up for questions on websites but they are either too difficult or not meant for beginners.I want some source which would help me to be more clear fundamentally and conceptually.
Thankyou.
You could start by coding some of the simpler Project Euler problems in C, and then translate them to assembly. The problems get progressively more challenging as you go.
This page has an on-line version of The Art of Assembly Language Programming by Randall Hyde, but without the laboratory exercises. However it still includes a lot of code snippets, and Randy takes a high-level approach to assembly programming using macros which will be familiar to a C programmer. (I worked with Randy nearly 30 years ago doing assembly language programming on the Apple II).
It depends on how "novice" you are, but I'll be suggesting the UVa Online Judge.
One thing you can do (recommended to me by an experienced programmer) is read really good code. The Linux kernel is written in C. You can go to http://www.oldlinux.org/ to study with the first version, which would probably be easier than the current one. Beyond that, I would recommend finding an open source project for C that interests you. Working on a real-world project that interests you is going to be the best way to grow your skills.

Would a novice learning C and Scheme simultaneously be considered bad practice? [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 1 year ago.
Improve this question
I've been on and off with the C language for the past year(?) until two months prior to present day when I decided to take my learning a bit more seriously. In some areas of the language I feel comfortable, but I know that by anyone's terms I'm still considered an amateur and have much, much more to learn.
Recently, I've heard nothing but good things about how helpful taking an approach in different paradigms is to gain perspective, so I figured maybe trying to learn another language would be nothing but beneficial to the areas I'm weak in with the C language and possibly programming concepts in general.
SICP is considered one of the most influential books every programmer should read according to stackoverflow and plenty of amazon review comments, so naturally I chose it - just recently purchased the hardback. I'm excited to learn in hopes of coming out with some much needed experience, but my only concern is whether it would be a problem for someone at an early stage as I am to attempt learning two languages with different paradigms at once. I'm hoping learning Scheme and the concepts from this book will help me to think differently and more abstractly with C rather than confusing me.
Any insight would be great - whether it be to continue with these two languages, perhaps choose another language to aid my C or drop the second language for now. I just need insight from a seasoned person on the matter.
Learning both will give you a good appreciation for the strengths and weaknesses of both langauges, as well as two very different problem solving approaches.
Have fun!
I think you'll be okay. It's similar to learning maths and chemistry at the same time, and most people manage just fine. (Except for people who don't understand maths and chemistry, and enroll into liberal arts ;) )
If you are new to programming, I would urge you to start with HTDP. Yes, it is scheme based, and focuses on recursion, but its goal is to give you a framework for approaching problems that is generally applicable. It may seem boring at first, telling you stuff you think you already know, but don't skim. The disciplined approach they take to approaching problems translates easily away from scheme and recursion, and is a useful tool in general.
There is no reason not to learn both languages at the same time. They are sufficiently different that you are unlikely to get confused. If you have time to learn only one, C is probably more generally useful, but they are both (by modern standards) very simple languages, so learning both should not be a problem.
Most academic environments (university, specifically) expect you to handle multiple new languages at the same time. (And there's hardly an earlier stage than "still in school.") Each subject is going to have its own preferred language in terms of features that benefit that subject, and each teacher is going to have their own preferred language and, well, they're the teacher so you just have to deal with it :)
As long as you can keep them separate, it's not really the language itself that's the important part. Focus instead on what that language does and what you can do with it.
Back at my school, it was easy to tell the freshmen from the seniors. The formers would talk about what languages they know, the latter would talk about what designs and abstract concepts they've used.
Remember, the language is just a tool. Development should be more language-agnostic, focusing more on the job at hand and just using the right tool for that job.
I disagree with some of the other answers. This is not like studying two different subjects simultaneously: you generate the same output (a useful computer program) in C or in Scheme, but you go about it in very different ways. Universities may have students taking classes using different languages at the same time, but those curricula are, in theory, curated by a thoughtful department that is trying to avoid confusing students.
While it is certainly possible to study both C and Scheme at the same time, they may turn out to not be complementary for you. I would recommend proceeding as you wish, but as soon as you hit a rough patch you may want to consider focusing on one at a time. Following HtDP is a great idea if you are new to programming. If you are comfortable programming in general and want to learn C -- a good goal to have! -- then you can focus on how you write programs in C. The key is that you first want to learn how to write programs, then you can focus on learning specific languages.
learning a programming language is no different than learning any other language. If you can handle learning spanish and french at the same time, you can handle C and Scheme.
Another reason to be familiar with both C and Scheme is the Foreign Function Interfaces (FFI) provided by almost all Scheme implementations. You can quickly prototype a product in Scheme (or some other Lisp) and then you may find that you need to optimize some portion of the code for speed. You can re-write that part in C and invoke your fast C function from Scheme using FFI. Or you may need to interface some library (GUI, database etc) with Scheme. Your C expertise coupled with the FFI will help you here.
Learning C has made me a better Scheme programmer and vice versa. After spending years with Scheme and Common Lisp, I've spent a year programming almost exclusively in C. When I go back to Scheme, it is much easier to express myself because I know the kinds of things the machine is good at; C has helped me develop a good sense for algorithms. Knowing Scheme before going into C allowed me to develop certain nonstandard idioms while learning the standard ones. I think that since the two are completely different ways of doing things, and they both have their advantages, they are the two best languages to master.

I need a project idea for an Artificial Intelligence class. Do you have one? [closed]

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.
Closed 11 years ago.
I wanted to ask Stack Overflow users for a nice idea for a project that could entertain a fellow student programmer during a semester. Computer vision might look interesting, although I couldn't say if a project on that field is something that could be achievable in 4 months. What do you think?
There is a story that, during the early days of AI research when significant progress was being made on "hard" logic problems via mechanical theorem provers, a professor assigned one of his graduate students the "easy" problem of solving how vision provided meaningful input to the brain. Obviously, things turned out to be far more difficult than the professor anticipated. So, no, not vision in the general sense.
If you are just starting in AI, there are a couple of directions. The classic AI problems - logic puzzles - are solved with a mechanical theorem prover (usually written in Lisp - see here for the classic text on solving logical puzzles). If you don't want to create your own, you can pick up a copy of Prolog (it is essentially the same thing).
You can also go with pattern recognition problems although you'll want to keep the initial problems pretty simple to avoid getting swamped in detail. My dissertation involved the use of stochastic proccesses for letter recognition in free-floating space so I'm kind of partial to this approach (don't start with stochastic processes though, unless you really like math). Right next door is the subfield of neural networks. This is popular because you almost can't learn NN without building some interesting projects. Across this entire domain (pattern processing), the cool thing is that you can solve real problems rather than toy puzzles.
A lot of people like Natural Language Processing as it is easy to get started but almost infinite in complexity. One very definable problem is to build an NLP program for processing language in a specific domain (discussing a chess game, for example). This makes it easy to see progress while still being complex enough to fill a semester.
Hope that gives you some ideas!
The staple software that most people implement as one of their first applications of ANNs is character recognition (not necessarily hand written characters).
You could do something simpler than general "vision", like point a webcam at a digital thermometer and read the temperature from that.
Can't tell without knowing more about you, your friend, and the project. My guess is "no".
I'd point you towards two sources. The first is Peter Norvig's "Artificial Intelligence"; the second is "Programming Collective Intelligence". Maybe they'll inspire you.
Write a spam filter. Pick an interesting corpus to train on and filter (Twitter messages, Facebook wall posts, blog comments...?). There are lots of ways to go about building the classifier, identifying training data, etc.
One thing I always wanted to do was improve the AI of older video games. Take DOOM for example. Very simplistic AI, compared to even what you see today. You could try improving or even completely rewriting AI for enemy characters in a video game.
Or you could write your own little game that specifically focuses on the computer making surprisingly informed decisions.
I've always thought it would be interesting to write something that will look at a post (say, a question here) and predict how many votes it will get. I originally thought of the idea in the context of looking at a blog or an article and predicting vote ups/downs on reddit (or more simply a bucket like low, medium, high).
A program that plays poker, hearts or similar.
Make it interesting, for example a game AI, I know a chess sim might take awhile, but maybe you could boil it down a bit (just 3 pieces, 2 rooks and a king each side) for example...
Turing tests are interesting. Here is a link on how LOLBot passed the turing test

What makes you a C programming expert? [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 4 years ago.
Improve this question
I attended a job fair yesterday and a developer asked me how I would rank my proficiency in C. I then realized that this is incredibly arbitrary and almost impossible to nail down, so my question is what knowledge makes you an expert in programming C?
Edit: or what would the breakdown be? what makes you good, decent, proficient, etc.
Edit again: I was looking more for like a list of skills or some other constructive measure by which to judge one's own proficiency in C, as that's hard to do.
List so far:
Experience in large projects
Mastery of Pointers (and memory management, I'd assume)
Mastery of a debugger (gdb, ...)
Mastery of a profiler (gprof,...)
Mastery of a memory profiler (valgrind, ...)
Knowledge of the fundamental standards
I think the trouble with this question is that the answer is kind of meaningless. I see people talking about experience, and that's good, and I see people talking about understanding the intricacies of the language, and that's good. However, if I were hiring someone to work on my C project, and I had a magic 8-ball that would give me an accurate answer to any one (and only one) question, I would never ask it, "Are they a C expert".
Why?
Just because someone is a C expert doesn't mean that they're a good software developer. Experience and language familiarity are good, but I think they are both trumped by that intangible, un-quantifiable property that makes someone a "good software developer". What I'm trying to say is, "What makes you a C programming expert?" is not a useful question, because there are more important questions. If someone is a Good Programmer, they will rise to the occasion.
As an example: You can be a C programming expert and be horrible on a team. You can be a C programming expert and refuse to use version control. You can be a C programming expert without knowing how to actually DO anything with C.
The "without" clauses in those sentences are equally important questions: What makes you a good team programmer? What's the best way to use SCM x or y? How do you approach programming a client/server game, or billing application, or web browser, or operating system, or compiler, in C? If a candidate told me "No, I am not a C expert", but gave me great answers to these other questions, I would hire them in a heartbeat over the guy who the magic 8-ball said was a C expert, but doesn't know how to check his code into subversion and hasn't learned a new language in 12 years.
When I interviewed with Google, the interviewer told me to think about it this way. On a scale of 1-10 for C proficiency, to say you're a "10" means you've written papers and/or books or been a speaker in a conference on programming in C. Based on this, very few people are 10s.
FWIW, I have been programming in C for 15 years. I consider myself very proficient. I'd perhaps give myself a solid 8 or 8.5.
To someone less skilled than you, you're an expert.
To someone more skilled than you, you're a newbie.
Experience is key, knowing the "rules" and syntax of the of the language is of course a must, but it is only a base. Learning the common pitfalls and idioms for doing things right is key.
Knowing what if any resources exist to get help from while your programing, and of course, knowing you're tool chain. I've known many C++ "experts" who had never used a debugger, or a memory tracker. If you ask me, being an expert in something is different from being proficient in something in you knowing all aspects of it.
Everyone is an expert at a job fair
You're an expert in c if you can answer all the questions tagged "c" on stackoverflow.com without blinking.
This doesn't directly answer your question (sorry), but it might help you decide how you classify yourself.
Instead of just "expert" and "clueless newbie" I prefer the three-level system of expertise used by the medieval guilds:
Apprentice
Still needs to RTFM.
Getting to grips with the tools and techniques of his craft.
Needs supervision.
Journeyman
Has Read The Effin' Manual.
Competent with all the standard tools and techniques of his craft.
Can work alone, and can supervise apprentices on routine jobs.
Master
Could have Written The Effin' Manual.
Is developing or adopting new tools and techniques.
Can oversee a major project that might never have been attempted before.
At a job fair? There are no experts: everybody's an expert. :)
Some may disagree but I think experience is key to being an expert in any language. I know plenty of people who've past the certification test but couldn't apply their knowledge to anything practical in the real world.
So I think overall being an expert is a product of having enough knowledge on a given subject (C) and then having applied it to enough real world scenarios to make the mistakes that we all do and learn from them.
The answers to this question do make for some interesting reading - it seems that we can't get good convergence on what defines an expert here. What hope is there going to be in a broader forum like a jobs fair? :-)
But to put my own 2 cents in...
I think there's two kinds of C expert.
There's the expert in the academic sense (as in "could write their own compiler", "has written papers").
There's the pragmatic expert. I would like to define this as "someone who can write elegant C code that anyone can understand".
I would take one of the latter over the former in a heartbeat. If you've got a chunk of code written by an expert that is so brittle that can only be read and understood by another expert then for all intents that code is unmaintainable.
It's all very nice that the author of this code remembers the intricacies of type conversions in the middle of expressions, but it's much better if the code has been written so that it's completely unambiguous.
Projects usually have enough technical challenge without adding the need for all team members to have memorized the C'99 standard.
You're an expert in C when you can write your own C compiler.
Interview questions like this are always tough. You want to blow your own horn a little, but not sound like a blowhard.
If you have done a lot with C (say, worked on open source projects in C), then I'd respond with that, but not just by pointing to the list of accomplishments on your resume, but by talking about one or more of them and what was particularly interesting or challenging about it (in regards to its use of C).
How about having read "Expert C Programming" by Peter van der Linden and remembering everything he covered?
Lacking a standard test there's really no way to decide what expert level is but here are a few of my litmus tests, everyone's list is different, I'm sure.
Without looking at documentation:
Know the precedence of the main operators so you don't have to litter your code with parens to avoid getting the wrong order of evaluation
Be able to write a prototype for a simple function pointer
Be comfortable with passing a pointer to a pointer
Understand block, function, module scope
There are more items like this.
On the other hand, I don't think you have to be able to understand or be able to write out Duff's device or figure out obfuscated C contests in your head to consider yourself an expert.
Even if I considered myself an expert (not sure I do) I probably would never claim it in a job interview.
Andrew
Mastery of pointers.
I would say that for any given language, experience is the key thing. It just takes time to learn a language and learn the APIs and 'idioms' that the language uses. Whether someone is an expert in anything or not is something that should be asked of ones peers. To paraphrase Jeff Foxworthy, "If you answer more questions than you ask, you might be an expert."
I think a fair answer would be understanding all of the intracies of ISO C.
The reality, as any comp.lang.c regular will tell you, is that almost nothing that people need to do can be done in pure ISO C, as you generally need to interact with your environment in a more well defined way. That's where POSIX comes about.
I would not blink at anyone who self-ranked themselves as an "Expert" who had a solid understanding of the language of C, a decent understanding of what ISO C promises, and a working understanding of the POSIX functions.
Being able to write papers/books doesn't necessarily make one an expert programmer. It takes plenty of hard work, practical experience and a good understanding of various C libraries.
Good luck!

Resources