在Prolog中不使用findall/3查找查询的所有匹配项



我得到了一个数据库,我正在用谓词查询数据库

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来在数据库中给我不同的出现。

实现这一点的一种方法是使用具有副作用的故障驱动循环。在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上的此响应。

相关内容

  • 没有找到相关文章

最新更新