保持逻辑纯粹和高效,如何做到?通过使用元谓词
tpartition/4
和
(#=<)/3
!首先,让我们定义
(#=<)/3
,它是基于
bool01_t/2
的
(#=<)/2
的具象化版本。
为了完整起见,让我们也定义
(#<)/3
,
(#>)/3
和
(#>=)/3
!请注意保留HTML标签。
#=<(X,Y,Truth) :- X #=< Y #<==> B, bool01_t(B,Truth).
#<( X,Y,Truth) :- X #< Y #<==> B, bool01_t(B,Truth).
#>( X,Y,Truth) :- X #> Y #<==> B, bool01_t(B,Truth).
#>=(X,Y,Truth) :- X #>= Y #<==> B, bool01_t(B,Truth).
就是这样!现在,让我们来分割OP想要的内容:
?- tpartition(#=<(0),[1,-2,3,4,-8,0],Ts,Fs).
Ts = [1,3,4,0], Fs = [-2,-8].
这是单调的,因此即使使用一般的、非地面术语,我们也能得到准确的答案。
?- tpartition(
Ts = [ ], Fs = [A,B,C], A in inf.. -1, B in inf.. -1, C in inf.. -1 ;
Ts = [ C], Fs = [A,B ], A in inf.. -1, B in inf.. -1, C in 0..sup ;
Ts = [ B ], Fs = [A, C], A in inf.. -1, B in 0..sup, C in inf.. -1 ;
Ts = [ B,C], Fs = [A ], A in inf.. -1, B in 0..sup, C in 0..sup ;
Ts = [A ], Fs = [ B,C], A in 0..sup, B in inf.. -1, C in inf.. -1 ;
Ts = [A, C], Fs = [ B ], A in 0..sup, B in inf.. -1, C in 0..sup ;
Ts = [A,B ], Fs = [ C], A in 0..sup, B in 0..sup, C in inf.. -1 ;
Ts = [A,B,C], Fs = [ ], A in 0..sup, B in 0..sup, C in 0..sup .
编辑于2015年6月2日
如果我们在上述查询中使用SWI-Prolog库谓词partition/4
会怎样呢?
?- partition(
Ts = [A,B,C], Fs = [], A in 0..sup, B in 0..sup, C in 0..sup.
我们会失去八成的解决方案,因为
partition/4
不是单调的!