我最近开始学习Prolog,我无法解决如何组合三个列表的问题.
我能够组合2个列表:
%element
element(X,[X|_]).
element(X,[_|Y]):-
element(X,Y).
%union
union([],M,M).
union([X|Y],L,S) :- element(X,L),union(Y,L,S).
union([X|Y],L,[X|S]) :- (not(element(X,L))),union(Y,L,S).
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
我知道这一点var/1,nonvar/1并且!/0是不纯的基元,但它们的使用是否会使每个使用它们的程序都不纯净?
我写了下面的谓词plus/3,表现得好像是纯粹的,或者至少是我声称的那样.谓词是示范性的,不是为了提高效率.
% nat(X) is true if X is a natural number
nat(0).
nat(X):- nonvar(X), !, X > 0.
nat(X):- nat(X1), X is X1 + 1.
% plus(A, B, C) is true if A,B and C are natural numbers and A+B=C
plus(A, B, C):-
nat(A),
(nonvar(C), C < A, !, false ; true),
plus_(B, A, C).
plus_(A, B, C):-
nat(A),
(nonvar(C), C < A, !, false ; true),
C1 is …Run Code Online (Sandbox Code Playgroud) 我想返回一个列表,删除所有独特的元素,例如
remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q).
Q = [1,1,2,2,4,4,6,6,6].
Run Code Online (Sandbox Code Playgroud)
我的问题是,目前我有返回的代码
remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q).
Q = [1, 2, 4, 6, 6].
Run Code Online (Sandbox Code Playgroud)
这样只返回这些非唯一值的第一个实例.这是我的代码:
remUniqueVals([], []).
remUniqueVals([Q1|RestQ],[Q1|Xs]) :-
member(Q1,RestQ),
remUniqueVals(RestQ,Xs).
remUniqueVals([Q1|RestQ],Xs) :-
remove(Q1,[Q1|RestQ], NewQ),
remUniqueVals(NewQ,Xs).
Run Code Online (Sandbox Code Playgroud)
我可以看到member(Q1,RestQ)它在第二次检查1,2,4时失败,因为它们现在不再在列表中,因此将它们删除.我想帮助解决这个问题,我的想法是检查member(Q1, PreviousQ),这是决赛中的元素Q.不知道如何实施,虽然任何帮助将不胜感激.
更新:
好的,谢谢你最终的结论:
remUniqueVals(_,[], []).
remUniqueVals(_,[Q1|RestQ],[Q1|Xs]) :-
member(Q1,RestQ),
remUniqueVals(Q1,RestQ,Xs).
remUniqueVals(PrevQ,[Q1|RestQ],[Q1|Xs]) :-
Q1 = PrevQ,
remUniqueVals(PrevQ,RestQ,Xs).
remUniqueVals(PrevQ,[_|RestQ],Xs) :-
remUniqueVals(PrevQ,RestQ,Xs).
remUniqueVals(0,[4,1,1,3,2,2,5,5],Q).
Q = [1, 1, 2, 2, 5, 5].
remUniqueVals(0, [A,B,C], [1,1]).
A = 1,
B = 1,
C = 1.
Run Code Online (Sandbox Code Playgroud) 这可能是一个函数的最简单的实现,它返回Prolog中列表的长度
count([], 0).
count([_|B], T) :- count(B, U), T is U + 1.
Run Code Online (Sandbox Code Playgroud)
关于Prolog的一件事我仍然无法理解,那就是使用变量作为参数的灵活性.
所以例如我可以跑步count([a, b, c], 3).和得到true.我也可以跑步count([a, b], X).并得到答案X = 2..奇怪(至少对我而言)是我还可以运行count(X, 3).并获得至少一个结果,这看起来像X = [_G4337877, _G4337880, _G4337883] ;解释器消失在无限循环之前.我甚至可以运行一些真正"灵活"的东西,count(X, A).并且得到X = [], A = 0 ; X = [_G4369400], A = 1.,这显然是不完整的,但不知何故真的很好.
因此,我的多方面问题.我可以以某种方式向Prolog解释在执行时不要超越第一个结果count(X, 3).吗?我可以以某种方式让Prolog为其生成任意数量的解决方案count(X, A).吗?我可以产生什么样的解决方案?这个特定的谓词是什么阻止我为所有可能的查询生成所有解决方案?