我有以下数据:
$("#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 solutions和Finding 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).
答案 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)
将失败,并且永远不会调用以下语句(...
)。当然,由于您在失败之前有writeln
,writeln
将会执行,显示您的结果。
作为一般性评论,您应该尝试将变量用于结果,而不是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)].