在这样的程序中使用库(real):
:- use_module( library(real) ).
:- use_module( library(lists) ).
:- use_module( library(apply_macros) ).
:- use_module( library(readutil) ).
my_sum(L, S):-
i <- L,
<- i,
S <- sum(i).
有没有办法修改程序以便能够向后运行它? 目前,这有效:
?- my_sum([1,2,3],X).
X = 6.
但这会导致异常:
?- my_sum(L,2).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [13] _6776=..[_6782|_6784]
ERROR: [12] real:r_call(_6814,[rvar(i),...|_6832]) at /home/raoul/lib/swipl/pack/real/prolog/real.pl:1101
ERROR: [8] my_sum(_6862++[...|_6870],2) at /home/raoul/Bureau/prolog_relational_stats/relational_R.pl:16
ERROR: [7] <user>
ERROR:
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
答案 0 :(得分:3)
从p。 4 the manual:
&lt; - / 1谓词发送一个R表达式,表示为地面Prolog 术语,对R,没有得到任何结果回Prolog。 &lt; - / 2运算符 促进双向通信。如果左侧是免费的 变量,库假定我们将数据从R传递到Prolog。 如果左侧是绑定的,则Real假定我们正在传递数据或 函数调用R。
如果L
未实例化,则代码会失败。
您可以像这样处理案件:
my_sum(L,S) :-
( ground(L), var(S) ->
i <- L, <- i, S <- sum(i)
; var(L), ground(S) ->
% your code here
; % error?
).
然后可以在任一方向使用my_sum/2
。