序言掩蓋了複雜的排序問題,註定了數據庫訪問,FIFO或後進先出法,用默認FIFO嚴格的時間模型。這是合理的,因爲這樣的訪問定義了的計算模型。
所以沒有標準的方法來改變子句檢索順序。
我認爲goal_expansion/2可以用來引入這樣的功能,我會嘗試一個原型。但我不知道我會得到什麼有用....
編輯
第一次嘗試,但是使用慢(但更簡單)縮回/斷言。
/* File: order_by.pl
Author: Carlo,,,
Created: Sep 5 2012
Purpose: sort fact
*/
:- module(order_by,
[order_by/2
]).
order_by(PredicateIndicator, Argument) :-
( PredicateIndicator = Module:Functor/Arity
; PredicateIndicator = Functor/Arity, Module = user
),
length(EmptyArgs, Arity),
P =.. [Functor|EmptyArgs],
findall(P, retract(Module:P), L),
predsort(by_arg(Argument), L, S),
maplist(assert_in_module(Module), S).
assert_in_module(Module, P) :-
assertz(Module:P).
by_arg(Argument, Delta, E1, E2) :-
arg(Argument, E1, A1),
arg(Argument, E2, A2),
( A1 @< A2
-> Delta = <
; Delta = >
).
測試文件(我測試只是在用戶模塊),注意: - 動態聲明是必需的:
/* File: order_by_test.pl
Author: Carlo,,,
Created: Sep 5 2012
Purpose:
*/
:- [order_by].
:- dynamic animal/1.
animal(dog).
animal(cat).
animal(elephant).
animal(bird).
animal(aardvark).
test :-
order_by(animal/1, 1),
forall(animal(X), writeln(X)).
測試結果:
?- test.
aardvark
bird
cat
dog
elephant