在prolog中重复数字,看看有多少
有人能帮我吗? 有一个数字列表,我们知道每个数字除了一个外,正好有两个出现。请编写一个Prolog代码来查找列表中的这个不规则数字。 示例:对于列表“(2 3 2 4 1 6 1 3 6),查找的不规则数字是4。请尝试以下代码:在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
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!请使用所需的行为、特定问题和代码更新您的问题。请看:这是非常必要的。最好不要使用讨厌的控制结构。把它分成两个条款。