0

我正在尝试将一个简单的 Turbo Prolog 问题转换为 Visual Prolog 7.1

原始的 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)并为 Turbo Prolog 控制台提供了正确的结果。

尝试将其转换为 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 的初学者,我不知道如何解决这个问题,谷歌也没有多大帮助,这似乎是一个非常模糊的问题。

谢谢!

4

1 回答 1

0

我不熟悉 Visual Prolog,但你能把有问题的行重写为:

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

然后再试一次?

请记住,谓词与其他编程语言中的函数不同;它们没有返回值。

编辑回答评论:一个过程谓词应该成功一次。在这里,main正在调用solve我多次失败或成功的你的函数。为确保这一点,您可以尝试将调用包装到另一个谓词中:

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

调用 to 后的 cutsolve应确保如果成功,您只获得一个解决方案。如果没有解决方案(即调用solve失败),那么第二个子句将给出一个默认值(在这种情况下是一个空列表)。

main中,您应该调用wrap_solve而不是solve

于 2016-12-19T12:49:06.947 回答