2016-12-19 3 views
0

을 생성하지 않습니다. 터보 프롤로그 콘솔에 정확한 결과를 제공하여 비주얼 프롤로그 오류 C502 : 표현은 내가 비주얼 프롤로그 7.1</p> <p>원래 터보 프롤로그 코드는 다음과 같다에게 간단한 터보 프롤로그 문제를 번역하려고 값

DOMAINS 
      s=string sl=s* sll=sl* 

    PREDICATES 
      select(sl,s,sl) 
      solve(sll) 

    CLAUSES 

      select([A|B],A,B). 
      select([A|B],C,[A|D]):- select(B,C,D). 

      solve([["Anna",A,A],["Kate",Vp,Vt],    ["Natasha",Np,"green"]]):- 
        select(["white","green","blue"],A,ColPl), 
        select(["white","blue"],A,[Vt]), Vt<>"white", 
        select(ColPl,Vp,[Np]), Vp<>"white", Np<>"green". 

그 결과리스트 solve(Out)로 출력된다. 비주얼 프롤로그이 번역하려고 할 때

, 나는 내가이 오류를 얻을하는 solve(Out) 인쇄 아무것도 제공하지 않는다는 것입니다 라인 (33)

implement main 
     open core 

    constants 
     className = "main". 
     classVersion = "". 
    domains 
    s=string. 
    sl=s*. 
    sll=sl*. 
    % 
    class predicates 
    select:(sl,s,sl) nondeterm anyflow. 
    solve:(sll) nondeterm anyflow. 
    % 
    clauses 
    % 
    select([A|B],A,B). 
    select([A|B],C,[A|D]):- select(B,C,D). 
    % 
    solve([["Anna",A,A],["Kate",Vp,Vt],["Natasha",Np,"green"]]):- 
    select(["white","green","blue"],A,ColPl), 
    select(["white","blue"],A,[Vt]), Vt<>"white", 
    select(ColPl,Vp,[Np]), Vp<>"white", Np<>"green". 

    clauses 
     classInfo(className, classVersion). 

    clauses 
     run():- 
      console::init(), 
      %ERROR AFTER THIS LINE 
      stdIO::writef("%", solve(Out)),fail(). 

    end implement main 

    goal 
     mainExe::run(main::run). 

에 오류 C502를 얻을. 내가 모르는 것은 인쇄 할 코드를 생성하는 코드를 변경하는 방법이다.

나는 Prolog의 초보자이며이 문제를 해결하는 방법을 알 수 없으며 Google은 많은 도움이되지 않는다. 이것은 매우 애매한 문제인 것처럼 보인다.

감사합니다.

답변

0

나는 비주얼 프롤로그에 익숙하지 해요,하지만 당신은 잘못된 선 다시 수 :

solve(Out), stdIO::writef("%", Out),fail(). 

을 다시 시도?

술어는 다른 프로그래밍 언어와 같은 기능이 아닙니다. 그들에게는 반환 가치가 없습니다.

편집 대답에 대한 대답 : 프로 시저 조건자는 정확히 한 번 성공해야합니다. 여기에서 main은 내 solve 함수를 호출하여 실패하거나 여러 번 성공합니다. 을 확인하려면 다른 조건으로 해결하기 위해 호출을 래핑하는 시도 할 수 있습니다 : solve에 대한 호출 후

wrap_solve(S) :- solve(S), !. 
wrap_solve([]). 

컷이 성공할 경우에만 하나 개의 솔루션을 얻을 수 있도록해야한다. 해결책이없는 경우 (즉, solve에 대한 호출이 실패한 경우) 두 번째 절은 기본값 (이 경우 빈 목록)을 제공합니다.

main에는 solve 대신 wrap_solve으로 전화해야합니다.

+0

귀하의 빠른 답변과 술어에 대한 이해를 고맙습니다! 불행하게도이 변경으로 인해 또 다른 오류가 발생합니다 : error c631 : 'procedure'로 선언 된 'main :: run/0'술어는 실제로 '실패'입니다 – Lowry

+0

당신의 'fail main의 정의. –

+0

이 변경 사항으로 '실패'가 'nondeterm'으로 바뀝니다 – Lowry