Следующая участница конкурса красоты! -)
В этом ответе показан измененный вариант кода, показанный в предыдущем ответе. Он использует овеществленное соединение и дизъюнкцию:
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)).
Обратите внимание на две версии для «и» и «или»; те, у которых есть суффикс _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),
Truth).
different(Xs,Ys) :-
different_t(Xs,Ys,true).
Он все еще работает?
?- different([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). % same result as before
?- different([4,2,3],[2,3,1]), different([1,2,3],[4,3,1]),
different([1,4,3],[2,3,1]), different([1,2,3],[2,4,1]),
different([1,2,4],[2,3,1]), different([1,2,3],[2,3,4]).
true. % same result as before
Выглядит хорошо!
В целом, это не огромное улучшение по сравнению с существующими ответами, но IMO несколько более читаемый код и обновленная версия different/2
в качестве дополнительного бонуса!
person
repeat
schedule
09.07.2015
different([a,b],Y).
он дает:Y = [_G122], dif(_G122, a) ;
, ноdif(_G122,a);
не требуется: даже если он равенa
, это не проблема. Конечно, если кто-то запроситdifferent([a,b],[Y])
, он получитdif(Y,a)
,dif(Y,b)
иdif(Y,b),dif(Y,a)
, но все же это не обязательно. - person Willem Van Onsem   schedule 16.06.2015