2013-04-05 58 views
0

在prolog中,如果列表中包含的元素是A/B,我有关于此规则的这个问题,该规则得到证实。如何在序言中避免未经证实的变量?

match(A,B,[H|T]) :- (H=A/B -> !; match(A,B,T)). 

这适用于当我给A和B的实例化变量和列表。但是,如果我将列表作为变量给出,那么我会得到一个列表,其中包含无意义的变量,如我不想获得的_GXXXX。有谁知道如何解决这一问题?

谢谢。

+1

同样,它不完全清楚你想达到什么。既可以明确定义你需要的结果,也可以给出例子。 – 2013-04-05 15:56:16

回答

0
  • 可以测试一个变量看它是否绑定到某事或不(使用谓词var/1nonvar/1

所以,举例来说,如果你想,如果它不是实例化你的第三个参数失败倒是做:

match(A,B,L) :- 
    nonvar(L), 
    L=[H|T], 
    (H=A/B -> !; match(A,B,T)). 

如果你只关心你的榜样约H,那么你会怎么做:

match(A,B,[H|T]) :- nonvar(H), (H=A/B -> !; match(A,B,T)). 
+0

在你的情况下,nonvar()失败,因为H或L都没有实例化。 – omega 2013-04-05 15:48:34

+0

@omega:对。 nonvar只有在它的参数没有实例化时才会成功。那不是你要找的东西吗? – gusbro 2013-04-05 15:53:59