2013-12-12 57 views
0

我是Visual Prolog中的一名新成员,据我所知,这种语言似乎是功能性的。等等,我有一个问题:我们可以做水木清华这样的(如果“可以”,那么“如何”):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. 

这个问题的原因 - 我需要调用以同样的方式不同的功能,从控制台检查答案。如果不是'是' - 停止运行程序。

+0

是'somefunc'总是一样的,'Func2'是否需要任何参数? – lurker

+0

@mbratch,是'somefunc'总是相同的,'Func2'可能没有参数,如果它很重要 –

回答

1

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

我从来没有使用Visual Prolog中,但你问在序言中最口味来完成我一直在使用= ../2和呼叫/ 1如下所示:

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

为实例:

X = writeln, Call =.. [X, 'Hellow World'], call(Call). 
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. 

还要注意,有一个专门的视觉Prolog的论坛:http://discuss.visual-prolog.com

相关问题