プロローグで次の述語を実装し、真理値表に使用したい: and/2、or/2、nand/2、nor/2、xor/2
たとえば and/2 を実装する方法を誰かが教えてくれるので、自分で他の実装を行ってここに投稿できます。
プロローグで次の述語を実装し、真理値表に使用したい: and/2、or/2、nand/2、nor/2、xor/2
たとえば and/2 を実装する方法を誰かが教えてくれるので、自分で他の実装を行ってここに投稿できます。
/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).
使用するには、A/B を true/false に置き換えます。例えば:
?- and(true,true).
true.
?- and(false, true).
false.
注意: おそらくand/3
の代わりに を意味しand/2
ます。AND は三項述語であり、2 ではなく3 つの真理値の間の関係を定義します。もちろん、具体化する (= 物事を明示する) 代わりに、真理値が暗黙的である Prolog の組み込みメカニズムを使用できます。しかし、まず最初に、三項関係から始めます。これにより、すべての真理値が明確になり、たとえば、「false
与えられた操作に対してどの真理値が得られるか?」などを尋ねることができるからです。まず始めに、 の真理値表の 1 つのエントリでand/3
、アトムを使用true
してブール値trueを示します。
and(true, true, true).
これとは別に、たとえば SICStus Prolog や GNU Prolog で利用できるブール制約の使用も検討してください。これにより、真理値とブール式の間の関係を宣言的に表現できます。
library(clpb)
SICStus Prolog での使用例:
| ?- sat(X*Y =:= T), X = 0.
X = 0,
T = 0 ?
これは、接続詞の最初の引数が false の場合、接続詞全体も false であることを示しています。さらに、たとえば、SICStus Prolog の CLP(B) ソルバーを使用して、次のいずれかを使用して、接続詞が可換であることを判断できます。taut/2
| ?- taut(A*B =:= B*A, T).
T = 1 ?
または普遍的に量化された変数は、原子として示されlibrary(clpb)
ます。
| ?- sat(a*b =:= b*a).
yes
したがって、バイナリ値を操作する場合、ブール制約は非常に便利なツールとなります。