コード美人コンテストの次の出場者!-)
この回答は、前の回答で示されたコードのリファクタリングされたバリエーションを示して
います。具体化された結合と分離を使用します。
and_(P_1,Q_1) :-
and_t(P_1,Q_1,true).
or_(P_1,Q_1) :-
or_t(P_1,Q_1,true).
and_t(P_1,Q_1,Truth) :-
if_(P_1, call(Q_1,Truth), Truth=false).
or_t(P_1,Q_1,Truth) :-
if_(P_1, Truth=true, call(Q_1,Truth)).
「and」と「or」の 2 つのバージョンに注意してください。接尾辞のあるもの_t
は真偽値の追加の引数を持ち、接尾辞のないものはそうではなく、それTruth=true
が成り立つと仮定します。
and_t/3
具体化された不等式述語に基づいてdif/3
、次のように定義しますnonmember_t/3
。
nonmember_t(X,Ys,Truth) :-
list_nonmember_t(Ys,X,Truth).
list_nonmember_t([] ,_, true).
list_nonmember_t([Y|Ys],X,Truth) :-
and_t(dif(X,Y), list_nonmember_t(Ys,X), Truth).
some_absent_t/3
では、different_t/3
とdifferent/2
を次のように定義しましょう。
some_absent_t([] ,_ ,false).
some_absent_t([X|Xs],Ys,Truth) :-
or_t(nonmember_t(X,Ys), some_absent_t(Xs,Ys), Truth).
different_t (Xs、Ys、真実) :-
or_t(some_absent_t(Xs,Ys),
some_absent_t(Ys,Xs),
真実)。
異なる(Xs,Ys) :-
different_t(Xs,Ys, true ).
それはまだ実行されますか?
?- 異なる([A,B],[X,Y])。
A=X , B=X , dif(Y,X)
; A=X , dif(B,X), dif(B,Y)
; A=Y 、 B=Y 、 dif(Y,X)、 dif(Y,X)
; A=Y , dif(B,X), dif(B,Y), dif(Y,X)
; dif(A,X), dif(A,Y)。% 前と同じ結果
?- 異なる([ 4 ,2,3],[2,3,1]), 異なる([1,2,3],[ 4 ,3,1]),
異なる([1, 4 ,3],[2,3,1]), 異なる([1,2,3],[2, 4 ,1]),
異なる ([1,2, 4 ]、[2,3,1])、異なる ([1,2,3]、[2,3, 4 ])。
真実。% 前と同じ結果
よさそうですね!
全体として、既存の回答に比べて大幅な改善はありませんが、IMO はやや読みやすいコードでありdifferent/2
、追加のボーナスとして の具体化されたバージョンです!