2011-08-22 63 views
1

我在PROLOG中构建了一些输入和输出相对简单的函数。为简单起见,像PROLOG中的函数输入和输出

func(List, Item, [Item | List]). 

现在,我已经有了代码,将调用其中的一些功能于一身的行传递的结果。问题是我必须不断为所有输出创建新的变量名称。

someOtherFunc(List, Item) 
    :- func(List, Item, Output1) 
    , doSomething(Output1). 

这里的问题是,我确实有几个func和几个doSomething,真的希望没有一个Output1变量显式绑定。有什么办法可以做到这一点?

+3

您可能可以使用DCG来隐藏参数,但我并不确定。在多次阅读你的问题后,我仍然不明白你到底想要什么...... – Kaarel

+2

它们不是函数,它们是谓词。然后,如果三个参数的谓词接受一个输入并产生一个输出,则其中一个参数是多余的。你的'func'谓词是不可操作的,所以你可能想要提供一个更好的例子。 –

回答

2

我不确定你要问什么,但首先请注意,那些是而不是函数,但谓词。这是一个完全不同的编程范例。变量不是用来输入和输出一些数据的“框”:它们更接近变量的数学含义,因为一旦你将它们绑定到对它们的值的一些约束上,它就是永远的。

回到你的问题,答案是否定的,你不能避免像这样绑定一些Output1。有时候你可以用一个下划线告诉序言你不关心那个价值,但是这样做你就失去了使用这个特定价值的能力。在你的榜样,你愿意做这样的事情(在必要的伪代码):

var list = ..., item = ...; 
doSomething(func(list, item)); 

还有,据我所知在序言没有其他办法,你就必须像你一样使用中间变量。我可以建议的唯一改进是非常仔细地选择谓词和变量名称。