prolog列表和列表操作

prolog列表和列表操作,prolog,Prolog,我正在尝试编写一个二进制谓词来获取一个列表,计算每个元素的mod 5,然后将其放入另一个列表中。到目前为止,我已经做到了 mod5(X,L):- R = [], modhelper(R,L), write(R). modhelper(X,L):- memb(E,L), mod2(E,Z), addtolist(Z,X,X), modhelper(X,L). %Get an element from the list L. memb(E,[E|_]). memb(E,[_|V]):

我正在尝试编写一个二进制谓词来获取一个列表,计算每个元素的mod 5,然后将其放入另一个列表中。到目前为止,我已经做到了

mod5(X,L):- R = [], modhelper(R,L), write(R).  
modhelper(X,L):- memb(E,L), mod2(E,Z), addtolist(Z,X,X), modhelper(X,L).  
%Get an element from the list L.  
memb(E,[E|_]).  
memb(E,[_|V]):- memb(E,V).  
%If element is integer, return that integer mod 5 else return as is.  
mod2(N,Z):- isInt(N) -> Z is N mod 5 ; Z = N.  
%add this modified element to the output list.  
addtolist(Y,[],[Y]).  
addtolist(Y,[H|T],[H|N]):- addtolist(Y,T,N).  
memb、mod2、addtolist工作正常,但我在modhelper中做了一些错误的事情,我无法弄清楚。 感谢您的帮助。

在SWI序言中:

mod5(X, Y) :-
    Y is X mod 5.

apply_mod5_to_list(L1, L2) :-
    maplist(mod5, L1, L2).
用法:

?- apply_mod5_to_list([2, 4, 6, 8], L2).
L2 = [2, 4, 1, 3].

?- apply_mod5_to_list([2, 4.1, 6, 8], L2).
ERROR: mod/2: Type error: `integer' expected, found `4.1'

?- apply_mod5_to_list([2, not_number, 6, 8], L2).
ERROR: is/2: Arithmetic: `not_number/0' is not a function
如果您想要稍微不同的行为,例如,如果您想要容忍非整数(顺便说一句,为什么要这样做?),您可以轻松地修改此代码

如果您不能使用
地图列表
,您可以自己实现它,至少是更专业的版本,例如:

partition_the_list_into_first_and_rest([X | Xs], X, Xs).

% The result on an empty list is an empty list
apply_mod5_to_list([], []).

% If the input list contains at least one member
apply_mod5_to_list(L1, L2) :-
    partition_the_list_into_first_and_rest(L1, X, Xs),
    call(mod5, X, Y),
    partition_the_list_into_first_and_rest(L2, Y, Ys),
    apply_mod5_to_list(Xs, Ys).

对于这段代码,您仍然可以应用大量语法简化,您可能应该这样做,以便将其转化为可接受的家庭作业解决方案…

感谢您的回复。这是家庭作业。我想我不允许使用地图列表。我想我知道我做错了什么。在modhelper中发送递归列表之前,我只需删除已处理的元素。然而,我面临着另一个问题。当输入类似于,-mod5(X,[[12]],a])。X=[“/r”];它将[12]解释为“/r”。如何防止这种情况发生?通过指定您希望允许的输入类型以及包含非整数的输入的结果来更新您的问题。X=[a,1,b,c(5),[12]],3]。我想这涵盖了大部分输入。非整数应保持不变。但是,在[[12]]的情况下,由于“\f”(表单提要)的ascii值,当我希望它按原样输出[[12]]时,它会输出[“\f”]。开始一个关于包含表单提要字符的漂亮打印列表的新问题,描述您当前是如何执行此操作的以及它有什么问题。此讨论不再属于此问题/答案。感谢您的帮助Kaarel。你的解决方案不太奏效。但是我确实找到了另一个更简单的解决列表问题的方法。我仍然不知道如何处理表单提要问题,但正如您所建议的,我开始了一个新问题,我希望有人知道如何解决它,因为我已经尝试了几个小时,但找不到解决方法。