2017-12-06 21 views
-1

프로그램 라이브러리 (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. 

답변

3

합니다. the manual의 4 :

< -/1 조건부 백 프롤로그 어떤 결과를 얻지 않고, R에 접지 프롤로그 용어로 표현되는 R 표현을 송신한다. < -/2 연산자 은 양방향 통신을 용이하게합니다. 왼쪽이 자유 변수 변수 인 경우 라이브러리는 R에서 Prolog로 데이터를 전달한다고 가정합니다. 왼쪽이 결합되면 는 실제 우리가 데이터를 전달하거나 기능 L이는 uninstantiated 경우 그래서 코드가 실패

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

감사합니다. 나는 그 문제가 무엇인지 이해했으나 그것을 해결할만큼 충분하지 못했다. 저는 프롤로그에서 아직 초보자입니다. – Raoul