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

时间:2014-10-01 09:17:52

标签: prolog prolog-findall

我获得了一个数据库,我使用谓词

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

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, ...).

要完整实施,see this response on StackOverflow