为什么prolog不能识别查询中的参数?

为什么prolog不能识别查询中的参数?,prolog,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

我将这部分代码作为递归谓词中的基本情况

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=5
m_var=[c,e]
,但它给出:
1=[[a,5]]
2=[c,e]

然而,如果我提示:
[[V,N]]=[[a,5]]。
它会做出正确的统一:
V=a
N=5


我做错了什么?谢谢大家!

要在Prolog中检测故障原因,请使用声明性调试:

将以下定义添加到程序中:

:- op(950,fy, *). *_. 即使有了更通用的版本,我们也可以:

?-riduci_lista_valori([a,5]],[c,e],F)。 错。 这意味着,如果您希望查询成功,则需要进一步概括您的程序。查看程序的实际剩余内容:

riduci_lista_valori([[V, N]], m_var, Lr) :- true. riduci_lista_valori([[V,N]],m_var,Lr):-正确。 此代码段已经太具体了。让我们这样概括一下:

riduci_lista_valori([[V, N]], Var, Lr) :- true. riduci_lista_valori([[V,N]],Var,Lr):-正确。 现在查询成功:

?-riduci_lista_valori([a,5]],[c,e],F)。 对。 因此,您的子句头的第二个论点是彻底检查的好候选者


可能您想使用变量来代替原子
m_var

要检测Prolog中的故障原因,请使用声明性调试:

将以下定义添加到程序中:

:- op(950,fy, *). *_. 即使有了更通用的版本,我们也可以:

?-riduci_lista_valori([a,5]],[c,e],F)。 错。 这意味着,如果您希望查询成功,则需要进一步概括您的程序。查看程序的实际剩余内容:

riduci_lista_valori([[V, N]], m_var, Lr) :- true. riduci_lista_valori([[V,N]],m_var,Lr):-正确。 此代码段已经太具体了。让我们这样概括一下:

riduci_lista_valori([[V, N]], Var, Lr) :- true. riduci_lista_valori([[V,N]],Var,Lr):-正确。 现在查询成功:

?-riduci_lista_valori([a,5]],[c,e],F)。 对。 因此,您的子句头的第二个论点是彻底检查的好候选者


也许你想用变量来代替原子
m_-var

谢谢你的回答,我学到了一些关于声明性去bug的新知识。但是你的最后一句话救了我一个晚上:)s(X),多棒的主意!您是否可以提供一个参考来解释\expans
关于Prolog的声明性调试
;特别是
op(920,fy,*)的使用。
这是一种很好的技术,我想将其纳入我的Prolog工具箱中。如果你想把这作为一个单独的问题,只需提问。也许它应该是一个带有参考文献的标签,比如Yes,请为这个有趣的主题提交一个单独的问题,这样我们就可以在那里收集参考文献了!谢谢你的回答,我学到了一些关于声明式除错的新知识。但是你的最后一句话救了我一个晚上:)s(X),多棒的主意!您是否可以提供一个参考来解释\expans
关于Prolog的声明性调试
;特别是
op(920,fy,*)的使用。
这是一种很好的技术,我想将其纳入我的Prolog工具箱中。如果你想把这作为一个单独的问题,只需提问。也许它应该是一个带有参考文献的标签,比如Yes,请为这个有趣的主题提交一个单独的问题,这样我们就可以在那里收集参考文献了!