2012-05-22 26 views
3

我很新的序言,我有我的地方可變似乎被遺忘了序言遺忘/ uninstantiating我的變量?

test(S) :- 
X = 'testing', 
(S = y, write(X)); 
(S = n, write(X)). 

運行

test(y) 

打印出來的文字如預期的那樣的問題,但

test(n) 

打印出

_L160 

我認爲這意味着變量是uninstantsiated?這是爲什麼發生?

我知道它可以吐成兩個謂詞,如:

test(y) :- X = 'testing', write(X). 
test(n) :- X = 'testing', write(X). 

,但我實際的問題是在這不能被簡化這樣一個更大的謂語。

回答

2

析取(;)目前要麼成功:

  1. 分配 '測試',以X,Y向S和寫X. 或者,如果失敗,回溯和
  2. 分配N到S和寫X

添加一些括號以使其按預期工作。

test(S):- 
X = 'testing', 
    (
     (S = y, write(X)) 
    ; 
     (S = n, write(X)) 
    ). 
3

您的問題是;/2的優先級。 如果您發出listing(test/1)你會得到這樣的:

test(A) :- 
    ( B=testing, 
     A=y, 
     write(B) 
    ; A=n, 
     write(B) 
    ). 

這說明解釋如何閱讀你的代碼。

您應該括起代碼來獲得你想要的東西:

test(S) :- 
    X = 'testing', 
    ((S = y, write(X)); 
    (S = n, write(X))). 
2

讓我重新縮進代碼爲您提供:

test(S) :- 
     ( X = 'testing', S = y, write(X) 
     ; S = n, write(X) 
     ). 

我希望這是更清楚,現在你真正寫道。