Profile

Cover photo
Marco Devillers
46,974 views
AboutPostsPhotosVideos

Stream

Marco Devillers

Shared publicly  - 
 
WWW: What. Went. Wrong?
1
Add a comment...

Marco Devillers

Shared publicly  - 
 
Pro-Russian militia now have military vehicles.
4
Add a comment...

Marco Devillers

Shared publicly  - 
 
Just push it

I am looking at the microcode for an assembly language for combinator rewriting. Because combinator rewriting is trivially represented by a machine which manipulates and creates arrays of words you'ld like to have a large number of registers referencing these arrays.

Register languages are verbose and slow. I know how to fix part of it, just push the arguments of newly created thunks, but I really don't feel like going into that direction because of esthetical reasons. Annoying.
1
Add a comment...

Marco Devillers

Shared publicly  - 
 
My life is better without condescending retards.
1
Add a comment...
 
A boring post. I've been thinking about writing another language; broadly: interpreted, untyped, impure, eager and functional.

I've been tinkering with programming languages for twenty years with large inactive periods in between. In total, I must have written tools for about three to seven different languages, I've lost count.

You would think that writing an interpreter for a language would get more easy as you learn more about the intricacies. It doesn't, it becomes harder.
1
Peter Kourzanov's profile photoMarco Devillers's profile photo
5 comments
 
Lisp, and Lisp deratives, concentrate on exploiting a simple operational model. The operational model is simple but goes against the abstractions one would like as a programmer. There's always a good reason to develop another programming language.
Add a comment...

Marco Devillers

Shared publicly  - 
 
My best bet from a CS perspective: If you don't know the formal complexity class of an AI sufficiently strong to pass a human test then you don't know the complexity class of an AI sufficiently strong to replace a human tester.

My other best bet: Probably humans are entirely stupid and their complexity class is very low. Probably lower than P.
 
A CS question that I don't know the answer to

A conversation on another thread raised an interesting question about computers that I can't figure out the answer to: Is judging a Turing Test easier than, harder than, or equivalently hard to passing a Turing Test?

I figured I would throw this question out to the various computer scientists in the audience, since the answer isn't at all clear to me -- a Turing Test-passer doesn't seem to automatically be convertible into a Turing Test-judger or vice-versa -- and for the rest of you, I'll give some of the backstory of what this question means.

So, what's a Turing Test?

The Turing Test was a method proposed by Alan Turing (one of the founders of computer science) to determine if something had a human-equivalent intelligence or not. In this test, a judge tries to engage both a human and a computer in conversation. The human and computer are hidden from the judge, and the conversation is over some medium which doesn't make it obvious which is which -- say, IM -- and the judge's job is simple: to figure out which is which. Turing's idea was that to reliably pass such a test would be evidence that the computer is of human-equivalent intelligence.

Today in CS, we refer to problems which require human-equivalent intelligence to solve as "AI-complete" problems; so Turing hypothesized that this test is AI-complete, and for several decades it was considered the prototypical AI-complete problem, even the definition of AI-completeness. In recent years, this has been cast into doubt as chatbots have gotten better and better at fooling people, doing everything from customer service to cybersex. However, this doubt might be real and it might not: another long-standing principle of AI research is that, whenever computers start to get good at a task that was historically considered AI, people redefine AI to be "oh, well, not that, even a computer can do it."

The reason a Turing Test is complicated is that to carry on a conversation requires a surprisingly complex understanding of the world. For example, consider the "wug test," which human children can pass starting from an extremely early age. You make up a new word, "wug," and explain what it means, then have conversations about it. In one classic example, the experimenter shows the kids a whiteboard, and rubs a sponge which he calls a "wug" across it, which (thanks to some dye) marks the board purple. Human children will spontaneously talk about "wugging" the board; but they will never say that they are "wugging" the sponge. (It turns out that this has to do with how, when we put together sentence structures, the grammar we use depends a lot on which object is being changed by the action. This is why you can "pour water into a glass" and "fill a glass with water," but never "pour a glass with water" or "fill water into a glass.") 

It turns out that even resolving what pronouns refer to is AI-complete. Consider the following dialogue:

Woman: I'm leaving you.
Man: ... Who is he?

If you're a fluent English speaker, you probably had no difficulty understanding this dialogue. So tell me: who does "he" refer to in the second sentence? And what knowledge did you need in order to answer that?

(If you want to learn more about this kind of cognitive linguistics, I highly recommend Steven Pinker's The Stuff of Thought [http://www.amazon.com/The-Stuff-Thought-Language-Window/dp/0143114247] as a good layman's introduction.)

In Turing's proposal, the test was always administered by a human: the challenge, after all, was to see if a computer could be good enough to fool a human into accepting it as one as well. But given that we're getting computers which are doing a not-bad job at these tests, I'm starting to wonder: how good would a computer be at identifying other computers?

It might be easier than passing a Turing Test. It could be that a computer could do a reasonable job of driving "ordinary" conversation off the rails (that being a common way of finding weaknesses in a Turing-bot) and, once a conversation had gone far enough away from what the computer attempting to pass the test could handle, its failures would become so obvious that it would be easy to identify.

It might be harder than passing a Turing Test. It's possible that we could prove that any working Turing Test administrator could use that skill to also pass such a test -- but not every Turing Test-passing bot could be an administrator. Such a proof isn't obvious to me, but I wouldn't rule it out.

Or it might be equivalently hard: either equivalent in the practical sense, that both would require AI-completeness, or equivalent in the deeper mathematical sense, that if you had a Turing Test-passing bot you could use it to build a Turing Test-administering bot and vice-versa. 

If there is a difference between the two, then this might prove useful: for example, if it's easier to build a judge than a test passer, then Turing Tests could be the new CAPTCHA. (Which was +Chris Stehlik's original suggestion that sparked this whole conversation) 

And either way, this might tell us something deep about the nature of intelligence.
1
Add a comment...

Marco Devillers

Shared publicly  - 
 
Looked at OMeta, the implementation of F# parser combinators, Spirit parser combinators, and the implementation of the Pure language.

Conclusion: A one off parser combinator library in C++.
1
Marco Devillers's profile photo
5 comments
 
No solution. Or rather, it is technically feasible, but at the cost of a tremendous amount of line noise.
Add a comment...

Marco Devillers

Shared publicly  - 
 
A Simple Idea: Combinator Rewriting

Historical Background

I've reread an old, somewhat hacked, paper on the operational semantics of the language and compiler I wrote. The paper shows how, abstractly, the language can be given a stack-like semantics. I used this idea to bootstrap the language from ML but the scheme in the to-C compiler was somewhat more simple and effective.

I gave up on developing that particular language after finding too many concrete, and potential, performance problems in the to-C compiler. MLton burned over fifty man-years on these problems and still arrived at a slow compiler; I don't have another fifty years.

(As a sidenote, never think bootstrapping a language is easy; I admire the MLton team. Sure, making a compiler self-hosting in language X is easy if you have some interpreter or compiler for X laying around. Developing a fresh language Y from a fresh bootstrapped compiler for Y is just one long bloody pain and an idea best left in the sixties. Which is why I am going to write an interpreter now.)

Combinator Evaluation

Forget about lambda! Combinator evaluation is naively the easiest and academically clearest manner of assigning an operational semantics to a functional language. In its naive implementation it's also usually about an order slower than other schemes; one of the reasons Haskell used to be, sometimes is, one of the slowest languages around.

A combinator captures the idea of a named rewrite. A definition is usually given in the following form:

S x y z → x z (y z)

Any four terms where the first terms is the symbol named 'S' and the other terms are abstractly represented by 'x', 'y', and 'z' can be rewritten to the left-hand side 'x z ( y z)'. If you fix the rewriting strategy you have a simple model for the operational semantics of a, or any, language.

A program is a graph of combinators waiting to be rewritten. An often used manner of rewriting a graph of combinators is to plug it into a stack based machine which will traverse the vertices and edges in a particular order while rewriting it.

Can you give an even simpler operational manner of rewriting a graph? Of course, no Nobel-price-winning idea here, you can.

The idea is simple: Instead of constructing a graph representing the AST of combinators to be rewritten, construct a graph where each combinator has two pointers going out: One 'return' pointer which points to the location where the result is to be placed and one 'eval' pointer which points to the combinator to be evaluated next. Add a third 'exception' pointer and you can add exception handling fairly trivially.

This is the idea I'll use. It's heavy on the heap but I am going for the simplest implementation and avoid the ML dreaded core dump because the machine ran out of stack. It won't be the fastest interpreter but my time is measured in development hours.
1
Add a comment...
 
After not having gotten a US-Russia Poland deal, a carve-up of the Ukraine on the basis of racist arguments, Russia might try this.

More likely they are playing hard-ball. But, yeah, they might try it.
 
Russia could achieve Ukraine incursion in 3-5 days-NATO general: Russia has all the forces it needs on Ukraine's border if it were to decide to carry out an "incursion" into the country and it could achieve its objective in three to five days, NATO's top military commander said on Wednesday.
1
Add a comment...
People
Work
Occupation
I am thinking of studying again.
Links
Contributor to
Story
Bragging rights
Divorced with 2 kids.
Basic Information
Gender
Male