まず、問題の表現方法を選択する必要があります。このporpouseの事実は十分です。回路は、入力信号(0または1)として
で表すことができます。これは、無限ループ(後述)を避けるために必要です。 回路 AおよびB ない/ 1を超える>論理演算 - -
XOR/2、/ 2、/ 2>等
このように、回路は、この形状をとるであろう:
今
xor(and(in(In1),in(In2)),or(in(In1),not(in(In3))))
は、のは、回路の状態を計算し、述語出力/ 1を、定義してみましょう:
output(xor(In1,In2),1) :-
output(In1,Out1),
output(In2,Out2),
Out1 \== Out2.
output(xor(In1,In2),0) :-
output(In1,Out1),
output(In2,Out2),
Out1 == Out2.
output(and(In1,In2),1) :-
output(In1,1),
output(In2,1).
output(and(In1,In2),0) :-
output(In1,Out1),
output(In2,Out2),
(Out1==0 ; Out2==0).
output(or(In1,In2),1) :-
(output(In1,1); output(In2,1)).
output(or(In1,In2,0),0) :-
output(In1,0),
output(In2,0).
output(not(In),0) :-
output(In,1).
output(not(In),1) :-
output(In,0).
output(in(0),0).
output(in(1),1).
このpredeciateはPORで可逆的です
?- output(xor(and(in(In1),in(In2)),or(in(In1),not(in(In3)))),Result).
In1 = In2, In2 = In3, In3 = 0,
Result = 1 ;
In1 = In2, In2 = In3, In3 = 0,
Result = 1 ;
In1 = In3, In3 = 0,
In2 = Result, Result = 1 ;
In1 = Result, Result = 1,
In2 = 0 ;
In1 = Result, Result = 1,
In2 = In3, In3 = 0 ;
In1 = In2, In2 = 1,
Result = 0 ;
In1 = In2, In2 = 1,
In3 = Result, Result = 0 ;
false.
output(A,B)
はoutput(in(A),B)
と混同すべきではない:pouse、入力がすべての出力を得るために自由変数として残すことができるようにします。 秒がちょうど0または1
instatiatedすることができる一方、最初は再帰的な回路で動作するようです任意の回路(無限ループ)をインスタンス化することができる。
?- output(or(in(Input),in(InOut)),InOut).
Input = InOut, InOut = 1 ;
InOut = 1.
を使用すると、任意のPrologのチュートリアルを読みましたまたはPrologのテキストブックを持っていますか?あなたは[prologタグの下の情報](http://stackoverflow.com/tags/prolog/info)を見たいかもしれません。 – lurker
コードを灰色で書いていたのですか、それとも提供されましたか? – JustAnotherSoul