Hacker News new | past | comments | ask | show | jobs | submit login
Show HN: You can program without loop and recursion and×÷- is all you need (github.com/raoofha)
9 points by raoof 3 months ago | hide | past | favorite | 17 comments



Why over complicate it? FRACTRAN is a Turning complete language based on only one operation: multiplication. It's Wikipedia entry gives a short FRACTRAN program that finds all primes. https://en.wikipedia.org/wiki/FRACTRAN

In the words of it's inventor, John Conway:

    Makes workday really easy!  FRACTRAN needs no complicate programming manual. It's entire syntax can be learned in 10 seconds, and programs for quite complex and interesting functions can be written almost at once.  The entire configuration of a FRACTRAN computer at any instant is a single integer - no messy "tapes" or other foreign concepts to be understood by the fledging programmer.
What's not to like? This is a good introduction for someone seriously considering doing their next project in FRACTRAN: https://raganwald.com/2020/05/03/fractran.html


FRACTRAN has a goto instruction so it is not a total model of computation but my claim is that Ar is a total model of computation. maybe unrolled FRACTRAN is a total model of computation too, I have to think about that


How do you go back to an earlier point in the program if you can't loop? For example, how would you do a primality test for an arbitrary input?


if you don't want to melt your brain :D you just precompute the value of any functions f(x) for x<n otherwise you need to be very clever I explained my idea in the link


Don't need a language then, just compile down to "return 4". No instructions needed. Without user input it's not really useful. How about returning maximum value of user-privided array of int64 values? If array is static, just return final value and that's all. Smart compiler for the win!

P.S. precomputing even a single int64 space is going to be really really hard, 2^64 possible values is a lot


the only approach to practical programming with Ar is to have external dependencies on hard to compute functions until I implement them :)


That's why I said an arbitrary number, you can't just precompute the primality of every single number... And I'm afraid I don't really understand your proof of being able to do loops without any kind of looping construct in the language itself


(it seems like I can't reply to your last comment so I do it here) it depend how you want to display the result to the user, you can just compute a number that represent an html page showing the numbers from 1 to n


the language is obviously (at least to me) turing-complete in the limit of the program length. even if you don't buy my argument that it is also turing-complete without the limit notice that in ordinary programming you never need a function that is valid on all input because actual computers have time and memory limitation


I must just be missing something then. How would you write a program that prints out the numbers from 1 to n, for reasonable n? (representable by a computer)


I think the issue here is that the language doesn't have any form of user input, so all possible programs are fully static and thus can be represented without any loops or conditionals.

I don't agree that the language is turning complete due to the lack of any runtime dynamic aspect of the language.

It's akin to compiling a simple c program with loops unrolled and fully static variables and claiming the subset of generated assembly is turning complete.


Agreed.

> It's akin to compiling a simple c program with loops unrolled and fully static variables

Yes, and optimizing compilers take this to an extreme. It turns out that "computing" a factorial only requires my runtime language to have `mov` and `ret` instructions: https://godbolt.org/z/3Y6bGcsba


in my model it's the platform job to handle the user input and your program output you just write your function and the platform calls your program for example f(time,input_data,key_a,key_b,key_c,...) . if you are very very patient and don't care about the program length you can just compute every output of your program for every possible input. according to [this](https://web.archive.org/web/20230505022436/http://page.mi.fu...) paper a single loop and four basic arithmetic operation is enough to simulate a turing machine so my idea was that to unroll the loop and my conjecture is that we don't need the loop and only four operations is enough to compute all total computable functions


(now I can reply here, let me repeat it again) it depend how you want to display the result to the user, you can just compute a number that represent an html page showing the numbers from 1 to n


The question isn't as to how it will be represented, that's the boring part.

When given a number n, and you want to display them, how will you actually compute the numbers from 1 to n? If you precalculate a table - then how will you do n+1? What about n+2?


it takes a lot of time and patient to come up with a function that works for all n and also have a short length, let me try if I can solve this problem it may takes a few hours or days or maybe months I'll post the solution here so stay tuned. but if you want to make your life easier you can generate the function in a meta language so you can always be sure that your software does not have a halting problem


       Epigram 54.

       Beware of the Turing tar-pit
       in which everything is possible
       but nothing of interest is easy.




Consider applying for YC's W25 batch! Applications are open till Nov 12.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: