我想在prolog中實現以下謂詞並將它們用於真值表:and/2或/ 2,nand/2,也沒有/ 2,xor/2Prolog實現和/ 2,或/ 2,nand/2,nor/2,xor/2
也許有人可以告訴我如何實現和/ 2例如,我可以做其他人我自己和張貼在這裏。
我想在prolog中實現以下謂詞並將它們用於真值表:and/2或/ 2,nand/2,也沒有/ 2,xor/2Prolog實現和/ 2,或/ 2,nand/2,nor/2,xor/2
也許有人可以告訴我如何實現和/ 2例如,我可以做其他人我自己和張貼在這裏。
請注意:您可能的意思是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
因此,使用二進制值時,布爾約束可能是非常有用的工具。
/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.
如果實際結果暗含着目標是否成功,那麼你很難回答以下這個可能很重要的問題:真值的哪些組合產生'假'?一個*三元關係'和/ 3'使得這個非常簡單明確:'? - 和(X,Y,假)'。對於其他關係也是如此,當您將真值明確化以便在查詢中易於訪問時,這些關係都是三元謂詞。 – mat
我會使用一個/ 3,但問題是如何使用/ 2。 –
iam告訴執行和/ 2或/ 2 – PROLOGik
? - 塔費爾(A,B和(A,或(A,B)))。 true true |真 true fail | true fail true |失敗 失敗失敗|失敗 – PROLOGik
您可以寫下像'and(X,Y)'這樣的術語,並且不需要爲此執行任何操作:它會在您寫下它時生效。你需要實現的是一個將這些術語與真值相關聯的謂詞。從'expression_truth/2'開始。一個例子子句:'expression_truth(true,true).'。留作練習:'expression_truth(和(X,Y),Truth): - ...',它將形式爲'和(X,Y)'的項與其真值相關聯。 – mat