视觉序列错误C502:表达不会产生值



我试图将简单的涡轮序问题转换为Visual Prolog 7.1

原始的涡轮序列代码如下。

    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)输出,并带有涡轮序列控制台的正确结果。

试图将其转换为Visual Prolog时,我在第33行中获得错误C502。

    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也不是什么帮助,这似乎是非常晦涩的问题。

谢谢!

我不熟悉Visual Prolog,但是您可以将有问题的行重写为:

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

然后重试?

请记住,谓词不是其他编程语言中的函数。他们没有回报值。

编辑以回答评论:一个过程谓词应完全成功一次。在这里,main调用您的solve功能,我的失败或成功了几次。为了确保这样做,您可以尝试将呼叫包裹为解决另一个谓词:

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

呼叫solve后的削减应确保如果成功,您只能获得一个解决方案。如果没有解决方案(即呼叫solve失败),则第二子句将给出默认值(在这种情况下为空列表)。

main中,您应该致电wrap_solve而不是solve

相关内容

  • 没有找到相关文章

最新更新