2017-12-06 8 views
-1

ライブラリを使用してプログラムをプロローグできます(実際のもの)をリレーショナルにすることはできますか?ライブラリを使用して、このようなプログラム(<a href="http://stoics.org.uk/~nicos/sware/real/" rel="nofollow noreferrer">real</a>)で

:- 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. 

答えて

3

Pから。 the manualの4:

< -/1述語はバックプロローグに任意の結果を得ることなく、Rに、地面のProlog 用語として表さR発現を、送信します。 < -/2オペレータ は、双方向通信を容易にします。左辺がフリーの 変数である場合、ライブラリはRからPrologにデータを渡しているとみなします。 左側がバインドされている場合、実際にはLがインスタンス生成されるのであれば、あなたのコードが失敗した

R.

に呼び出す我々はデータや 機能を渡していることを前提としています。

あなたはこのようなケースを扱うことができます。そして、

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はどちらの方向にも使用することができます。

+0

ありがとうございます。私は問題が何であるかを理解していたが、それを解決するには十分ではなかった。私はまだPrologの初心者です。 – Raoul

関連する問題

 関連する問題