代码选美比赛的下一位参赛者!-)
此答案显示了
先前答案中显示的代码的重构变体。它使用具体化的连词和析取:
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”的两个版本;有后缀的_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, Truth ) :-
or_t(some_absent_t(Xs,Ys),
some_absent_t(Ys,Xs),
真相)。
不同(Xs,Ys):-
不同的_t(Xs,Ys,真)。
它还运行吗?
?-不同([A,B],[X,Y])。
A=X , B=X , 差异(Y,X)
; A=X , 差异(B,X), 差异(B,Y)
; A=Y , B=Y , 差异(Y,X), 差异(Y,X)
; A=Y,差异(B,X),差异(B,Y),差异(Y,X)
; 差异(A,X),差异(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
作为额外奖励的具体版本!