2016-12-19 35 views
0

我想翻譯一個簡單的Turbo Prolog的問題到Visual Prolog的7.1視覺Prolog的錯誤C502:表達式不會產生一個值

原來的Turbo Prolog的代碼如下。

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)與輸出提供了一個正確的結果,以渦輪Prolog的控制檯。

當嘗試這種轉換爲Visual Prolog中,我得到錯誤C502在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). 

我從這個錯誤中得到的是solve(Out)不給任何要打印。我不知道的是如何更改代碼以生成要打印的內容。

我是Prolog的初學者,我無法弄清楚如何解決這個問題,Google也沒什麼幫助,這似乎是一個很晦澀的問題。

謝謝!

回答

0

我不熟悉Visual Prolog的,但是你可以重寫有問題的路線爲:

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

,然後再試一次?

請記住,謂詞不是像其他編程語言中的函數;他們沒有回報價值。

編輯回答評論:一個過程謂詞應該成功一次。在這裏,main正在呼叫您的solve功能,我的失敗或成功幾次。爲了確保這一點,你可以嘗試換電話解決到另一個斷言:

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

調用solve後切口應確保你得到只有一個解決辦法,如果它成功。 如果沒有解決方案(即對solve的調用失敗),則第二個子句將給出默認值(在這種情況下爲空列表)。

main中,您應該致電wrap_solve而不是solve

+0

感謝您對我的謂詞理解的快速回答和更正! 不幸的是,這個改變會產生另一個錯誤: 錯誤c631:聲明爲'procedure'的謂詞'main :: run/0'實際上是'failure' – Lowry

+0

可能是因爲你的fail() 'main'的定義。 –

+0

通過此更改,'失敗'現在替換爲'nondeterm' – Lowry

相關問題