我开始学习Prolog.该程序试图获取给定元素的所有出现:
occurences(_, [], Res):- Res is [].
occurences(X, [X|T], Res):-
occurences(X,T,TMP),
Res is [X,TMP].
occurences(X, [_|T], Res):- occurences(X,T,Res).
Run Code Online (Sandbox Code Playgroud)
但这是错误:
?- occurences(a,[a,b,c,a],Res).
ERROR: is/2: Arithmetic: `[]/0' is not a function
^ Exception: (11) _G525 is [] ? creep
Exception: (10) occurences(a, [], _G524) ? creep
Exception: (9) occurences(a, [a], _G524) ? creep
Exception: (8) occurences(a, [c, a], _G524) ? creep
Exception: (7) occurences(a, [b, c, a], _G524) ? creep
Exception: (6) occurences(a, [a, b, c, a], _G400) ? creep
Run Code Online (Sandbox Code Playgroud) 消除列表元素的连续重复.
我的解决方案是:
compress([X,X|Xs], Q) :-
compress([X|Xs], Q).
compress([X,Y|Xs], Q) :-
X \= Y,
compress([Y|Xs], QR),
append([X], QR, Q).
compress([X|[]], Q) :-
compress([], QR),
append([X], QR, Q).
compress([], []).
Run Code Online (Sandbox Code Playgroud)
并且,由于我是初学者并且我没有逻辑范例的经验,我请求您说出我可以改进的内容以及为什么我的解决方案不尽如人意.
例如,X \= Y对我来说并不漂亮.
编写一个谓词,它将整数列表作为输入L,并生成两个列表:包含偶数元素L的列表和来自的奇数元素列表L.
?- separate_parity([1,2,3,4,5,6], Es, Os).
Es = [2,4,6], Os = [1,3,5] ? ;
no
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Prolog(SWI Prolog)中创建一个列表,并检查哪些数字是2的幂,然后查找列表中特定数字的次数(在此示例中,我试图查找该数字的次数)列表中有3个).举个例子,如果你问
?- check([0,2,3,-5,-2,1,8,7,4], MULT2, THREE).
Run Code Online (Sandbox Code Playgroud)
你应该看到
MULT2=[2,8,4]
THREE=1
Run Code Online (Sandbox Code Playgroud)
我第一次尝试找到一个解决方案是用头部搜索列表并执行头部mod 2 = 0来查找所有2次幂的数字,但是出了点问题我只得到"假"作为答案.
例子
divisible([L1],X) :-
L1 mod X =:= 0.
Run Code Online (Sandbox Code Playgroud)
询问
divisible([4,6,8,7],2).
Run Code Online (Sandbox Code Playgroud)
回复
[4,6,8]
Run Code Online (Sandbox Code Playgroud)
有什么指导吗?