Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog添加和删除列表元素(如果第二个列表中不存在)_List_Prolog - Fatal编程技术网

List Prolog添加和删除列表元素(如果第二个列表中不存在)

List Prolog添加和删除列表元素(如果第二个列表中不存在),list,prolog,List,Prolog,我不知道我错过了什么 如果元素在arg1中但不在arg2中,我想添加它;如果元素在arg1中但不在arg2中,我想删除它 我使用的if条件包含一个函数,如果元素在arg2列表中,该函数将返回true,否则返回false。然后使用内置谓词append并选择添加或删除 includes([],_). includes([P|Z],S) :- memberchk(P,S), includes(Z,S). addop([],list,res). addop([P|R],list,res) :-

我不知道我错过了什么

如果元素在arg1中但不在arg2中,我想添加它;如果元素在arg1中但不在arg2中,我想删除它

我使用的if条件包含一个函数,如果元素在arg2列表中,该函数将返回true,否则返回false。然后使用内置谓词append并选择添加或删除

includes([],_).
includes([P|Z],S) :-
    memberchk(P,S), includes(Z,S).

addop([],list,res).
addop([P|R],list,res) :-
    includes(P,s0) -> addop(R,list,res) ; append(P,list,res),
    addop(R,list,res).


rem([],list,res).
rem([P|R],list,res) :-
    includes(P,list) -> rem(R,list,res) ; select(P,list,res),
    rem(R,list,res).
我对我所有的目标都错了。我根据我想要的谓词添加或删除注释和取消注释

includes([],_).
includes([P|Z],S) :-
    memberchk(P,S), includes(Z,S).

addop([],list,res).
addop([P|R],list,res) :-
    includes(P,s0) -> addop(R,list,res) ; append(P,list,res),
    addop(R,list,res).


rem([],list,res).
rem([P|R],list,res) :-
    includes(P,list) -> rem(R,list,res) ; select(P,list,res),
    rem(R,list,res).

谢谢您的帮助。

关于您的代码有两条评论:

您的includes谓词似乎将列表作为第一个参数,但您似乎将其当作来自addop和rem的原子来使用。 addop谓词引用s0,s0没有在任何地方定义,因此代码不会编译。 列表中,res和s0是原子。将每个字母的首字母大写,使其成为变量

目前,您对addop和res的调用可能失败,因为没有匹配规则。

您真的需要使用memberchk和includes吗?如果列表项很简单,则可以使用成员谓词,这通常是内置的:

% member(Element, List) -- determines whether Element is a member of list List
member(X, [X|_]).
member(X, [_|T]):- member(X, T).
据此,addop可定义如下:

% addop(A, B, R) -- returns items from A which are not in B
% (filters A over B)
addop(A, [], A).
addop([], _, []).
addop([H | T], L, R):- member(H, L), addop(T, L, R). % skip the item
addop([H | T], L, [H | R]) :- addop(T, L, R). % add the item to the result
添加rem可以是:

% rem(A, B, R) -- returns items from A which are in B
% (A intersect B)
rem(_, [], []).
rem([], _, []).
rem([H | T], L, [H | R]) :- member(H, L), rem(T, L, R). % add the item to result
rem([_ | T], L, R):- rem(T, L, R).

您是否可以将代码格式化为使用backticks的代码,或者EditorOne上的101010按钮,这并没有改善append to work的许多想法,因为它的所有参数都应该是列表;在您的示例“appendP,list,res”中,P不是列表。例如'append'a'、['b'、'c']、X'将计算为false。