"Hello, <name>!", the second program improved.

After "Hello, world!" it's typical to write a program that asks the user's name and greets them. In this post we learn how to do this in SWI-Prolog without requiring a full-stop.


Okay, so in Prolog when we get user input at the prompt we usually need our user to be wise enough to close their input with a full-stop. Let's demonstrate, in order for this example to work in Tau Prolog you'll need to input a valid atom and terminate in a full-stop (the input will appear to reset but actually append until a full-stop is included). You can try greet/0 with your favorite Prolog implementation, it'll work in most.

?-

But what if our users weren't so wise? Wouldn't it be nice if you could type in your name without a full-stop? We can replicate the above using JavaScript to compare. In this example you can write your name with a capital letter, without escaping it in single quotes first, and without a full-stop: like most people would.

?-

That's great and all, except we're hijacking JavaScript to do it, what we need is a solution that'll work in the terminal. Here's one solution that works in SWI-Prolog:

That's not going to appear in a beginner's book anytime soon! Let's break it down.

First we get the current_input(Stream), which by default is your prompt. We then use read_string/5 . It reads from the Stream up to '\n', which is when your user hit return. The argument ' \r' are the characters stripped off the left and right of the string. Sep is -1 if the user terminated the input (for example by Ctrl+D), otherwise we can unify String0 with String and return that.

Try this out, you can skip the full-stop! We're also reading a string, so case is irrelevant. If you like it, there's a more versatile implementation read_line_to_string/2 that can cope with files and other streams, as well as related predicates in the readutil library.