0

我是 Visual Prolog 的新手,据我所知,这种语言似乎很实用。等等,我有一个问题:我们可以这样做(如果“可以”,那么“如何”):

func1(X, Y, Func2) :-
  R = somefunc(X,Y),
    if R = "yes", ! then
       Func2  %here I want to call function with name, which is in variable 'Func2'
    else
        stdIO::write("End of work"),
        stdIO::nl,
        fail
    end if.

这个问题的原因 - 我需要以相同的方式调用不同的函数,并从控制台检查答案。如果不是“是” - 停止运行程序。

4

2 回答 2

1

首先,Prolog 没有函数,那些东西是谓词。差异很重要,因为可以有多种方法来满足(证明)谓词为真,但通常只有一种方法可以解释函数。

我从未使用过 Visual Prolog,但是您所要求的可以在我见过的大多数 Prolog 风格中使用 =../2 和 call/1 来完成,如下所示:

Func2WithArgs =.. [Func2, Arg1, Arg2],
call(Func2WithArgs).

例如:

X = writeln, Call =.. [X, 'Hellow World'], call(Call).
于 2013-12-12T20:39:18.000 回答
0

代码看起来是正确的,只是在调用函数时需要括号。即你必须写Func2() 而不是Func2。

func1(X, Y, Func2) :-
   R = somefunc(X,Y),
   if R = "yes", ! then
       Func2()  % parentheses here
    else
       stdio::write("End of work\n"),
       fail
    end if.

但是,如果 func1 和 Func2 确实是函数,则需要处理返回值:

func1(X, Y, Func2) = Result :-
   R = somefunc(X,Y),
   if R = "yes", ! then
       Result = Func2()
    else
       stdio::write("End of work\n"),
       fail % No result when failing
    end if.

另请注意,有一个专门的 Visual Prolog 论坛:http ://discuss.visual-prolog.com

于 2016-01-18T12:05:15.557 回答