2013-10-28 23 views

回答

3

請注意:您可能的意思是and/3,而不是and/2。 AND是一個三元謂詞,定義了真值之間的關係,而不是2.當然,不要用通俗化(=使事情明確),而是可以使用Prolog的內置機制,其中隱含真值。但是首先,我要從三元關係開始,因爲這會使所有的真值都顯式化,並讓您也可以要求例如:「對於給定的操作,哪些真值會產生false?」爲了讓您一開始,爲and/3,這裏我用的是原子true真值表來表示布爾值一個條目:

and(true, true, true). 

獨立地,也可以考慮使用布爾約束,這例如在SICStus Prolog和GNU Prolog中可用,並讓您以聲明方式表達真值和布爾表達式之間的關係。在SICStus Prolog中使用library(clpb)

實施例:

| ?- sat(X*Y =:= T), X = 0. 
X = 0, 
T = 0 ? 

這表明,如果一個配合的第一個參數爲假,則整個結合也是假。此外,我們可以例如使用SICStus的Prolog的CLP(B)解算器,以確定結合是可交換的,即使用taut/2

| ?- taut(A*B =:= B*A, T). 
T = 1 ? 

或普遍量化變量,表示爲原子library(clpb)

| ?- sat(a*b =:= b*a). 
yes 

因此,使用二進制值時,布爾約束可能是非常有用的工具。

+0

iam告訴執行和/ 2或/ 2 – PROLOGik

+0

? - 塔費爾(A,B和(A,或(A,B)))。 true true |真 true fail | true fail true |失敗 失敗失敗|失敗 – PROLOGik

+0

您可以寫下像'and(X,Y)'這樣的術語,並且不需要爲此執行任何操作:它會在您寫下它時生效。你需要實現的是一個將這些術語與真值相關聯的謂詞。從'expression_truth/2'開始。一個例子子句:'expression_truth(true,true).'。留作練習:'expression_truth(和(X,Y),Truth): - ...',它將形式爲'和(X,Y)'的項與其真值相關聯。 – mat

4

/2是可能的,而且實際上非常有效。

and(A,B) :- A,B. 
or(A,B) :- A;B. 
nand(A,B) :- not(and(A,B)). 
nor(A,B) :- not(or(A,B)). 
xor(A,B) :- or(A,B), nand(A,B). 

要使用只是用true/false替換A/B。例如:

?- and(true,true). 
true. 
?- and(false, true). 
false. 
+2

如果實際結果暗含着目標是否成功,那麼你很難回答以下這個可能很重要的問題:真值的哪些組合產生'假'?一個*三元關係'和/ 3'使得這個非常簡單明確:'? - 和(X,Y,假)'。對於其他關係也是如此,當您將真值明確化以便在查詢中易於訪問時,這些關係都是三元謂詞。 – mat

+1

我會使用一個/ 3,但問題是如何使用/ 2。 –