2013-04-05 60 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