まず、問題のより適切な表現を選択する必要があります。このネズミイルカには事実だけで十分です。回路は次のように表すことができます。
in/1 --> 入力信号 (0 または 1)。これは、無限ループを避けるために必要です (後述)。
xor/2、and/2、or/2 -->回路A と B に対する論理演算。not/1 --> など
このようにして、回路は次の形になります。
xor(and(in(In1),in(In2)),or(in(In1),not(in(In3))))
ここで、回路の状態を計算する述語 output/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).
このプレデシエーションはポルポウスで可逆であるため、すべての出力を取得するために、入力を自由変数として残すことができます。
?- 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)
。1 つ目は任意の回路 (無限ループ) にインスタンス化でき、2 つ目は 0 または 1 にインスタンス化できます。
再帰回路で動作するようです:
?- output(or(in(Input),in(InOut)),InOut).
Input = InOut, InOut = 1 ;
InOut = 1.