、、dif、
および:にmy_perm/2
基づいて定義します。same_length/2
list_permuted/2
mapadj/2
my_perm(Xs,Ys) :-
same_length(Xs,Ys),
mapadj(dif,Ys),
list_permuted(Xs,Ys).
用途の広いメタ述語 mapadj/2
は、次のように定義できます。
:- meta_predicate mapadj(2,?), list_mapadj(?,2), list_prev_mapadj(?,?,2).
mapadj(P_2,Xs) :-
list_mapadj(Xs,P_2).
list_mapadj([],_).
list_mapadj([A|As],P_2) :-
list_prev_mapadj(As,A,P_2).
list_prev_mapadj([],_,_).
list_prev_mapadj([A1|As],A0,P_2) :-
call(P_2,A0,A1),
list_prev_mapadj(As,A1,P_2).
これがOPによって与えられたサンプルクエリ1、2です。
call_time/2
ミリ秒単位の実行時間を測定するために使用しますT_ms
。
?- call_time(my_perm([1,1,1,1,1,2,2,3,3,4,4,5,5],[1,2,1,5,1,3,1,4,1,2,3,5,4]),T_ms).
T_ms = 0.
最初のいくつかの解決策を見つけるのにどのくらい時間がかかりますか?
?- call_time(my_perm([1,2,1,5,1,3,1,4,1,2,3,5,4],Xs),T_ms).
T_ms = 0, Xs = [1,2,1,5,1,3,1,4,1,2,3,5,4]
; T_ms = 0, Xs = [1,2,1,5,1,3,1,4,1,2,3,4,5]
; T_ms = 10, Xs = [1,2,1,5,1,3,1,4,1,2,5,3,4]
; T_ms = 10, Xs = [1,2,1,5,1,3,1,4,1,2,4,3,5]
; T_ms = 10, Xs = [1,2,1,5,1,3,1,4,1,2,5,4,3]
; T_ms = 10, Xs = [1,2,1,5,1,3,1,4,1,2,4,5,3]
; T_ms = 10, Xs = [1,2,1,5,1,3,1,4,1,3,2,5,4]
; T_ms = 20, Xs = [1,2,1,5,1,3,1,4,1,3,2,4,5]
; T_ms = 20, Xs = [1,2,1,5,1,3,1,4,1,5,2,3,4]
; T_ms = 20, Xs = [1,2,1,5,1,3,1,4,1,4,2,3,5]
; T_ms = 20, Xs = [1,2,1,5,1,3,1,4,1,5,2,4,3]
; T_ms = 20, Xs = [1,2,1,5,1,3,1,4,1,4,2,5,3]
; T_ms = 20, Xs = [1,2,1,5,1,3,1,4,1,3,5,2,4]
; T_ms = 20, Xs = [1,2,1,5,1,3,1,4,1,3,4,2,5]
; T_ms = 20, Xs = [1,2,1,5,1,3,1,4,1,5,3,2,4]
; T_ms = 20, Xs = [1,2,1,5,1,3,1,4,1,4,3,2,5]
; T_ms = 30, Xs = [1,2,1,5,1,3,1,4,1,5,4,2,3]
; T_ms = 30, Xs = [1,2,1,5,1,3,1,4,1,4,5,2,3]
...
単調に増加することに注意してくださいT_ms
。これは、指定された目標を最初に呼び出してから費やされた時間を測定します。
すべてのソリューションを列挙するのにどのくらい時間がかかりますか?
?- call_time(\+((my_perm([1,1,1,1,1,2,2,3,3,4,4,5,5],_),false)),T_ms).
T_ms = 4030.
ソリューションはいくつありますか?
?- use_module(library(aggregate)),
aggregate(count,Xs,my_perm([1,2,1,5,1,3,1,4,1,2,3,5,4],Xs),N).
N = 197664.
脚注1:SICStus Prologバージョン4.3.2(x86_64-linux-glibc2.12)を使用します。
脚注2:Prologプロセッサーによって与えられた回答シーケンスは、読みやすさのために適合されています。