在 Prolog 中评估术语并编写它

Evaluate term in Prolog and write it

嗨,我正在学习序言(在 Mac 上使用 swi-prolog 7),但我找不到足够的 docs/tutorials 来解释如何打印出学期评估的结果。我尝试了下面的代码,但它总是为任何参数打印出 ERROR: prolog/test.pl:2: user:main: false

#!/usr/bin/env swipl
:- initialization(main, main).

fun1(A, B):- A < B.
fun2([A1 | A2]):- A3 is fun1(A1, A2), write(A3).

main(args) :- fun2(args).

如何将 fun1 的结果写入 SWI-Prolog 中的标准输出?

也许是这个?

fun1(A,B,Value) :-
    (
        A < B
    ->
        Value = true
    ;
        Value = false
    ).

fun2(A1,A2) :-
    fun1(A1, A2, Value ),
    format('Result: ~w~n',[Value]).

示例运行:

?- fun2(1,2).
Result: true
true.

在 Prolog 中,您必须将每一行的结果视为真或假,然后可能将值绑定到变量或更复杂的状态。

问题中的代码返回谓词是真还是假,但没有将值绑定到变量或改变状态。通过添加Value作为附加参数,然后在谓词中绑定一个值,Value中的值就可以用于显示。


编辑

评论中来自OP的问题

I have never seen -> is it documented somewhere? Sorry if it is a noobie question.

不,这不是一个菜鸟问题,实际上,你问而不是在这个问题上溃烂是明智的。

参见:Control Predicates

特别是 ->/2 or (:Condition -> :Action) is often used with ;/2,它们一起工作就像 if then else,例如

if then else syntax:

注意这不是 Prolog 语法,而是许多 imperative programming languages.

中常见的语法
if (<condition>) then
  <when true>
else
  <when false>

-> ; syntax:

这是 Prolog 语法。

(
   <condition>
->
   <when true>
;
   <when false>
)

编辑

评论中来自OP的问题

When I run this code without the init block and main, so just in interactive mode, then it works. When I try to make a script out of it I get the same error ERROR: prolog/test.pl:2: user:main: false

首先

main(args) :- fun2(args).

args 是一个值,但需要是一个变量,在 Prolog 变量中默认以大写字母开头。

main(Args) :- fun2(Args).

接下来,main/1 中收到的 Args 是一个列表,但 fun2/2 需要两个单独的参数。因此,通过将 Args 解构为具有 Args = [A1,A2] 的两个项目的列表,列表中的项目可以用作单独的项目以作为参数传递给 fun2/2.

main(Args) :-
    Args = [A1,A2],
    fun2(A1,A2).

顶级示例 运行。

?- main([1,2]).
Result: true
true.

我把它留作练习,以检查它是否按需要从命令行运行。