可以使用库(真实)的prolog程序成为关系吗?

时间:2017-12-06 17:04:17

标签: prolog logic constraints relation

在这样的程序中使用库(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.

1 个答案:

答案 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