序言中的Hello world

问题描述:

我正在撕裂我的头发,试图找到如何在Prolog中编写Hello World程序。我只是想创建一个运行像这样的程序:序言中的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 :) – 2010-08-26 14:39:52

+9

我不知道,我认为Prolog在应用程序中的大部分*真实*实现将它用作嵌入式语言,而不是编写整个应用程序(UI,文件I/O,硬件控制等)。 ..)在Prolog。 – FrustratedWithFormsDesigner 2010-08-26 14:44:58

使用GNU Prolog

 
$ cat hello.pl 
:- initialization(main). 
main :- write('Hello World!'), nl, halt.

$ gplc hello.pl $ ./hello
Hello World!

+0

仅供参考,[SWI-Prolog](http://www.swi-prolog.org/pldoc/man?predicate=initialization/1) – 2017-04-22 17:40:05

序言不是真的通用语言。我们用它来设计大学的人工智能系统。

你必须定义一个事实,它回答“你好世界”。

hello('hello world'). 

然后,询问事实:

?- hello(X). 

但是,根据序言编译器,你可能有一个write()规则,你可以使用:

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

这不回答这个问题。这只是解释了如何在REPL中运行它。这与OP想知道的完全相反。此外,OP明确表示,他对于如何在REPL中运行它有一百万个解释这一事实感到沮丧,但没有解释如何使其完全按照自己的意愿去做,即打印单个字符串。 – 2015-04-18 11:46:37

writeln('hello world'). 

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

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

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

假设你把这个名为“HW”的文件,并设置可执行权限,你可以这样调用它要:

$ ./hw 
Hello World 
$ 
+0

我注意到'write(3 + 1)'打印'3 + 1'而不是'4'。有没有什么方法可以打印像这样的算术表达式的输出? – 2015-06-09 04:05:21