2

データベースが与えられ、述語を使用してデータベースにクエリを実行しています

findmin(A,B,course(X,Y)):- course(X,Y),X >= A,Y =< B.

私は自分のデータベースを次のように持っています。

course(a1,b1).
course(a2,b2).
course(a3,b3).
...

標準のfindall/3述語を使用する代わりに、独自の findall を使用したいのですが、

finda(X,findmin(A,B,X),L)

常にデータベースの先頭に移動する再帰を使用すると、findmin を再帰的に使用してデータベース内の個別のオカレンスを取得する方法がわかりません。

4

1 に答える 1

0

これを実現する 1 つの方法は、副作用のある失敗駆動ループを使用することです。実装の場合、これは大まかに次のように実現できます。findall

finda(X, Goal, Xs) :-
    % execute the goal to produce the binding for X
    Goal,
    % assert the result to the database (the 'side-effect')
    assert_to_db(..., Goal, ...)
    % deliberately fail, forcing Goal to be re-evaluated
    fail. 
finda(_X, _Goal, Xs) :-
    % retrieve the result from the cache and clear it
    retrieve(..., Xs, ...).

完全な実装については、StackOverflow のこの応答を参照してください

于 2014-10-03T00:40:04.237 に答える