Prolog 是否在始终返回true时删除列表中的所有空格?
此谓词删除列表中特定元素的出现Prolog 是否在始终返回true时删除列表中的所有空格?,prolog,Prolog,此谓词删除列表中特定元素的出现 delMember(_, [], []). delMember(X, [X|Xs], Y) :- delMember(X, Xs, Y). delMember(X, [T|Xs], [T|Y]) :- dif(X, T), delMember(X, Xs, Y). 我从一个文件生成了一个列表,其中每一行都成为一个元素。但是,某些行可能是所有空格,应该删除。上面的谓词将删除一个只有一个空格的行,但是我需要添加两个特性。首先,我需要它删除所有
delMember(_, [], []).
delMember(X, [X|Xs], Y) :-
delMember(X, Xs, Y).
delMember(X, [T|Xs], [T|Y]) :-
dif(X, T),
delMember(X, Xs, Y).
我从一个文件生成了一个列表,其中每一行都成为一个元素。但是,某些行可能是所有空格,应该删除。上面的谓词将删除一个只有一个空格的行,但是我需要添加两个特性。首先,我需要它删除所有空间的元素,而不仅仅是那些只有一个空间的元素。其次,如果它没有找到所有空格的元素,我仍然需要它原封不动地返回列表。创建一个谓词来验证原子是否仅由空格组成:
spaces(Atom) :-
atom_chars(Atom, Chars),
forall(member(Char, Chars), Char == ' ').
del_spaces([], []).
del_spaces([X|Xs], R) :-
( spaces(X)
-> del_spaces(Xs, R)
; R = [X|Ys],
del_spaces(Xs, Ys) ).
例如:
?- spaces(' a ').
false.
?- spaces(' ').
true.
?- spaces(' ').
true.
然后,使用该谓词仅过滤不由空格组成的原子:
spaces(Atom) :-
atom_chars(Atom, Chars),
forall(member(Char, Chars), Char == ' ').
del_spaces([], []).
del_spaces([X|Xs], R) :-
( spaces(X)
-> del_spaces(Xs, R)
; R = [X|Ys],
del_spaces(Xs, Ys) ).
示例:
?- del_spaces([' ', one, 't w o', ' ', three], L).
L = [one, 't w o', three].
?- del_spaces([one, 't w o', three], L).
L = [one, 't w o', three].
那个谓词是不可靠的。它将删除与delMember/3的第一个参数相统一的任何元素(不仅是那些具有1个空格的元素,并且在列表中向下时保持统一),并乐观地保留在调用dif/2时无法确定它们与delMember/3的第一个参数“结构相等”的元素。带dif/2的条款排在最后。这一切看起来有点不对劲。