Visual Prolog 错误 c502:表达式不产生值
Visual Prolog error c502: The expression does not produce a value
我正在尝试将一个简单的 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 的初学者,我不知道如何解决这个问题,Google 也没什么帮助,这似乎是一个非常晦涩的问题。
谢谢!
我对 Visual Prolog 不熟悉,但是你能不能把有问题的那一行重写为:
solve(Out), stdIO::writef("%", Out),fail().
再试一次?
请记住谓词不是其他编程语言中的函数;他们没有 return 值。
编辑以回答评论:过程谓词应该恰好成功一次。在这里,main
正在调用您的 solve
函数,我多次失败或成功。为确保这一点,您可以尝试将调用包装到另一个谓词中:
wrap_solve(S) :- solve(S), !.
wrap_solve([]).
调用 solve
后的剪辑应该确保您在成功时只得到一个解决方案。
如果没有解决方案(即调用 solve
失败),则第二个子句将给出默认值(在这种情况下为空列表)。
在main
中,你应该调用wrap_solve
而不是solve
。
我正在尝试将一个简单的 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 的初学者,我不知道如何解决这个问题,Google 也没什么帮助,这似乎是一个非常晦涩的问题。
谢谢!
我对 Visual Prolog 不熟悉,但是你能不能把有问题的那一行重写为:
solve(Out), stdIO::writef("%", Out),fail().
再试一次?
请记住谓词不是其他编程语言中的函数;他们没有 return 值。
编辑以回答评论:过程谓词应该恰好成功一次。在这里,main
正在调用您的 solve
函数,我多次失败或成功。为确保这一点,您可以尝试将调用包装到另一个谓词中:
wrap_solve(S) :- solve(S), !.
wrap_solve([]).
调用 solve
后的剪辑应该确保您在成功时只得到一个解决方案。
如果没有解决方案(即调用 solve
失败),则第二个子句将给出默认值(在这种情况下为空列表)。
在main
中,你应该调用wrap_solve
而不是solve
。