Prolog中的Hello world

25

我正苦苦寻找如何在Prolog中编写一个Hello World程序。 我只想创建一个像这样运行的程序:

> ./hw
Hello, world!
>
问题在于我能找到的每个例子都是在REPL中运行的,就像这样:
?- consult(hello_world).
% hello compiled 0.00 sec, 612 bytes

Yes
?- hello_world.
Hello World!

Yes

即使是编译后的Prolog示例也是这样,程序仍然只会进入REPL。 这显然对于“通用”语言来说并没有多大用处。 那么,我该如何编写传统的Hello World程序呢?


5
你的声明式编程优点现在去哪了?MWHAHAHA :) - Karmic Coder
10
我不确定,但我认为大多数应用程序中使用Prolog的“真正”实现是将其作为嵌入式语言来使用,以发挥其所擅长的功能,而不是完全使用Prolog编写整个应用程序(包括用户界面、文件I/O、硬件控制等)。 - FrustratedWithFormsDesigner
4个回答

21

使用GNU Prolog:

$ cat hello.pl 
:- initialization(main).
main :- write('你好,世界!'), nl, halt.

$ gplc hello.pl $ ./hello
你好,世界!


请注意,在SWI-Prolog中相同。 - user5834035

11

您可以编写源文件来启动Prolog解释器,并在代码运行完成后退出它。以下是使用SWI-Prolog的示例:

#!/usr/bin/swipl -q -t hello_world -f

hello_world :- write('Hello World'), nl, 
               halt.

假设你将这段代码存储在一个名为 'hw' 的文件中,并设置执行权限,你可以按照你想要的方式来调用它:

$ ./hw
Hello World
$

我注意到 write(3 + 1) 输出的是 3 + 1 而不是 4。有没有一种方法可以打印出像这个表达式的输出? - Anderson Green

4

Prolog并不是一种真正的通用语言。我们在大学中使用它来设计人工智能系统。

您需要定义一个事实,回答“hello world”。

hello('hello world').

那么,先了解一下事实:

?- hello(X).

然而,根据PROLOG编译器的不同,您可能拥有write()规则可供使用:

?- write('hello world'), nl.

2
这并没有回答问题,只是另一种解释如何在REPL中运行它。这恰恰与OP想知道的相反。此外,OP明确表示他感到沮丧的原因正是有无数关于如何在REPL中运行它的解释,但没有解释如何使其做到完全符合自己的要求,即打印一个字符串。 - Andrey Tyukin

1
writeln('hello world').

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接