在 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.
不,这不是一个菜鸟问题,实际上,你问而不是在这个问题上溃烂是明智的。
特别是 ->/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.
我把它留作练习,以检查它是否按需要从命令行运行。
嗨,我正在学习序言(在 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.
不,这不是一个菜鸟问题,实际上,你问而不是在这个问题上溃烂是明智的。
特别是 ->/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.
我把它留作练习,以检查它是否按需要从命令行运行。