2017-01-09 75 views
0

我把这部分代码作为递归谓词中的基本情况。为什么prolog不能识别查询中的参数?

riduci_lista_valori([[V, N]],m_var,Lr):- 
    member(V, m_var), 
    Lr =[N]. 

的问题是,当我执行我的查询并不统一,其参数谓词的正确的论点。

鉴于代码,我的查询是:riduci_lista_valori([[a, 5]], [c,e], F). 而且我希望Prolog返回F = [5]。 调试代码似乎不能正确识别参数,因为它不像统一一样:V = a,N = 5m_var = [c,e]但它给出: 1 = [[a, 5]]2 = [c, e]

鉴于如果我提示:[[V, N]] = [[a,5]].它使正确的统一: V = a,N = 5

我在做什么错?谢谢!

回答

4

为了检测故障的原因在序言中,使用声明调试

以下定义添加到您的程序:

:- op(920,fy, *). 
*_. 

现在,你可以使用(*)/1概括客场具体目标。

例如:

 
riduci_lista_valori([[V, N]], m_var, Lr) :- 
     *member(V, m_var), 
     *Lr =[N]. 

即使有这么多的更一般的版本,我们得到:

 
?- riduci_lista_valori([[a, 5]], [c,e], F). 
false. 

这意味着,如果你希望查询到在所有成功,你需要进一步概括你的程序。见依然是程序的究竟是什么:

 
riduci_lista_valori([[V, N]], m_var, Lr) :- true. 

这个片段已经太具体。让我们来概括它是这样的:

 
riduci_lista_valori([[V, N]], Var, Lr) :- true. 

现在查询成功

 
?- riduci_lista_valori([[a, 5]], [c,e], F). 
true. 

因此,您的从句头的这第二个参数是一个很好的候选人彻底的检查!

也许你想用一个变量代替原子m_var

+0

感谢您的回答,我学到了一些关于声明性debbugging的新知识。但你的最后一行拯救了我的夜晚:) –

+0

s(X),这真是个好主意! –

+1

你能否包含一个参考文件来解释\扩展关于Prolog的'declarative debugging';特别是使用'op(920,fy,*)。'这是一个很好的技术,我想将它融入到我的Prolog工具箱中。如果你想这是一个单独的问题只是问。也许它应该是一个带有参考标签的标签,如[tag:failure-slice] –

相关问题