我想要写一个代码,它将返回列表中唯一元素的数量。我的想法是检查单子表的头是否在单位表的列表中。如果不是,则将其添加到列表中并增加计数器,然后继续保留其余的列表。所以,我尝试了如下:
count([],0).
count([X,T], N) :-
count([X,T], [], N). %initially list of unique elements is empty
count([X,T], U, N) :- % U is a list of unique elements
(not(member(X, U)), append(U, X, U2));
count(T, U2, N1),
N is N1 + 1.
%------ helpers ------
member_(X,[Y|T]):-
member_(X, T).
member_(X,[X|_]).
append([], Y, [Y]). % append[] and Y to get Y.
append([H|X], Y, [H|Z]) :- append(X, Y, Z). % append [H|X] and Y to get [H|Z] if appending X and Y gives Z但是运行在上面只返回false
3 ?- count([1,2,3],N).
Call: (10) count([1, 2, 3], _7714) ? creep
Fail: (10) count([1, 2, 3], _7714) ? creep
false.为何会这样呢?
发布于 2021-03-13 15:20:09
,但在上面运行,只需返回false:
3 ?-计数(1,2,3,N)。呼叫:(10)计数(1,2,3,_7714)?蠕变失败:(10)计数(1,2,3,_7714)?爬错了。
为何会这样呢?
因为没有一个count([1,2,3],N)可以匹配的子句的头。
对于count/2您有两个子句:
count([],0). %%% clause 1
count([X,T], N) :- ... %%% clause 2由于[1,2,3]不能与[]统一,所以第1条是不匹配的。但是[1,2,3]也不能与[X,T]统一,因此第2条也是不匹配的。因此,count([1,2,3],N)无法被证明。
你可以通过问
?- [X,T]=[1,2,3].
false.您需要递归地分解任意长度的列表,而不是[X|T]。(请测试?- [X|T]=[1,2,3].,看看如何修复代码。)
https://stackoverflow.com/questions/66614927
复制相似问题