Prologは、複雑な順序付けの問題を詳しく説明し、DBアクセス、FIFO、またはLIFOの厳密な時系列モデルを指示しました。デフォルトは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