在prolog中重复数字,看看有多少

在prolog中重复数字,看看有多少,prolog,Prolog,有人能帮我吗? 有一个数字列表,我们知道每个数字除了一个外,正好有两个出现。请编写一个Prolog代码来查找列表中的这个不规则数字。 示例:对于列表“(2 3 2 4 1 6 1 3 6),查找的不规则数字是4。请尝试以下代码: findIrregular(L,Z):- member(Z,L), count(L,Z,1). count([], Z ,0). count([H|T], X, Z):- count(T, X, Z1), (X == H -> Z

有人能帮我吗? 有一个数字列表,我们知道每个数字除了一个外,正好有两个出现。请编写一个Prolog代码来查找列表中的这个不规则数字。 示例:对于列表“(2 3 2 4 1 6 1 3 6),查找的不规则数字是4。

请尝试以下代码:

findIrregular(L,Z):-
    member(Z,L),
    count(L,Z,1).

count([], Z ,0).
count([H|T], X, Z):-
    count(T, X, Z1),
    (X == H -> Z is Z1 +1 ; Z is Z1).
因此,对于输入:
?-findIrregular([2,3,2,4,1,6,1,3,6],Z)

输出为:

Z=4

让我们选择一种Prolog-y方法来解决这个问题

使用。(这些“收集所有解决方案”的元调用实际上是Prolog的主要任务,它们甚至不是一阶逻辑。谁想在一阶逻辑中贫民区?)

完整的测试代码:

% find_irreg(+List,?Number)

find_irreg(L,N) :- member(N,L),\+bagof(_,member(N,L),[_,_]).

% ===
% Test code
% ===

:- begin_tests(irreg).

test(1, fail)                  :- find_irreg([1,2,3,4,1,2,3,4],_).
test(2, [true(X == 1),nondet]) :- find_irreg([1,2,3,4,2,3,4],X).
test(3, fail)                  :- find_irreg([],_).
test(4, fail)                  :- find_irreg([1,2,3,4,2,3,4],10).

:- end_tests(irreg).

rt(irreg) :- run_tests(irreg).
因此:

?- rt(_).
% PL-Unit: irreg .... done
% All 4 tests passed
true.
为什么这样做有效:

find_irreg(L,N) :-                % N is an irregular member of L if
   member(N,L),                   % N is a member of L AND
   \+bagof(_,member(N,L),[_,_]).  % Collecting all Ns from L does not 
                                  % give a list of two elements

在操作上,Prolog尝试使用从
L
中选择的每个
N
来实现
\+bagof
bagof/3
在其内部
成员(N,L)
上回溯(现在使用固定
N
),并且每当它发现
N
时,它就会将一个不关心变量
\uu
放入行李列表中。最后,它检查其行李列表是否与
[\uu,\u]
一致,即正好有两个元素。如果这样做有效,
N
是我们不想要的元素之一,所以我们在
bagof

前面放了一个
\+
,欢迎来到Stackoverflow!请使用所需的行为、特定问题和代码更新您的问题。请看:这是非常必要的。最好不要使用讨厌的控制结构。把它分成两个条款。