如何在Prolog中打印出有限数量的搜索

时间:2016-07-14 10:27:47

标签: prolog

我有以下数据:

     $("#greyOut").click ( function() {
       $('image').attr('xlink:href', 'adamPNGgrey.png');
     });

我使用以下命令显示所有值:

item(one, 50, 40).
item(two, 80, 70).
item(three, 100, 55).
item(four, 50, 45).
item(five, 50, 40).
item(six, 80, 70).
item(seven, 100, 55).
item(eight, 50, 45).

但是,它会显示所有项目。如果有数百个这样的条目,这可能是一个问题。如何显示有限数量的项目,例如3以上情况?

我发现有一些帖子:Prolog: "findall" for limited number of solutionsFinding up to N unique solutions of a goal in Prolog以及Prolog: "findall" for limited number of solutions,但我无法解决这个问题。

我正在尝试关注代码,但它没有占用列表的长度:

findall((A,B,C), item(A,B,C), L).

输出:

head(N):-
    findall((A,B,C), item(A,B,C),L),
    writeln(L),
    writeln("------ 1 ---------"),
    length(L, N),
    writeln(N),
    writeln("------ 2 ---------"),
    head2(L, N, 0).

head2(L, N, M):-
    M < N, 
    nth0(M, L, Item), 
    writeln(Item),
    X is M+1, 
    head2(L, N, X).

2 个答案:

答案 0 :(得分:1)

我在下面注意到了一件事:

head(N) :-
    findall((A,B,C), item(A,B,C),L),
    writeln(L),
    writeln("------ 1 ---------"),
    length(L, N),
    ...

考虑基本的Prolog原则:只有当 findall/3产生列表L 并且 L的长度时,才会成功确切N。如果您查询head(3),并且findall/3生成长度不是3的列表,则length(L, N)将失败,并且永远不会调用以下语句(...)。当然,由于您在失败之前有writelnwriteln将会执行,显示您的结果。

作为一般性评论,您应该尝试将变量用于结果,而不是writeln语句。 writeln非常适合提示用户或跟踪代码的特定部分,但不适用于生成可在以后使用的结果。

另一种方法:

find_n_items(MaxCount, Items) :-
    findall((A,B,C), item(A,B,C), AllItems),
    length(AllItems, AllItemsCount),
    ItemsCount is min(AllItemsCount, MaxCount),
    length(Items, ItemsCount),  % Constrain the length of Items
    append(Items, _, AllItems). % Select ItemCount items from front of AllItems

这里我们将Result的长度限制为findall/3生成的最小值和请求的长度限制,并使用{{1}从AllResults的前面获取该元素数量}}

答案 1 :(得分:1)

:- dynamic limitcount/1.

maxbacktrack :-
    retract(limitcount(Current)),
    Current > 0,
    Next is Current-1,
    assert(limitcount(Next)).

firstN(N,Pred) :-
    retractall(limitcount(_)),
    asserta(limitcount(N)),
    Pred,
    maxbacktrack.

findN(N,Term,Pred,List) :-
    findall(Term,firstN(N,Pred),List).

例如:

?- findN(3,(A,B,C),item(A,B,C),L).
L = [ (one, 50, 40), (two, 80, 70), (three, 100, 55)].