4

プロローグで次の述語を実装し、真理値表に使用したい: and/2、or/2、nand/2、nor/2、xor/2

たとえば and/2 を実装する方法を誰かが教えてくれるので、自分で他の実装を行ってここに投稿できます。

4

2 に答える 2

8

/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.
于 2013-10-31T14:50:07.510 に答える
3

注意: おそらく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

したがって、バイナリ値を操作する場合、ブール制約は非常に便利なツールとなります。

于 2013-10-28T10:48:22.507 に答える