如果我搜索的元素不在列表中,我想创建一个TRUE的谓词。
没有任何内置谓词或算术结构。
我是prolog的初学者,目前我在oop语言中思考的方式太多了。
先谢谢你提前了。
答案 0 :(得分:1)
list_without([], _).
list_without([E|Es], F) :-
dif(E,F),
list_without(Es, F).
最接近的人是否能得到。它确实使用dif/2
这是一个内置的谓词。但没有其他方式可以以合理的方式表达不平等。有关详情,请参阅prolog-dif。
此定义可以多种方式使用:
定期测试:
?- list_without([a,b,c],d).
true.
但也有更普遍的情况:
?- list_without([a,b,c],X).
dif(X, c),
dif(X, b),
dif(X, a).
?- list_without([a,b,c],X), X = a.
false.
?- list_without([a,b,c],X), X = d.
X = d.
?- list_without([a,b,E],d).
dif(E, d).
答案 1 :(得分:0)
假设列表和要测试的元素都是 ground ,加上标准控件结构不被归类为内置谓词,那么解决方案就是:
list_without(List, Element) :-
list_without(List, Element, Copy),
equal(List, Copy).
list_without([], _, []).
list_without([Head| Tail], Element, Copy) :-
( equal(Head, Element) ->
list_without(Tail, Element, Copy)
; Copy = [Head| TailCopy],
list_without(Tail, Element, TailCopy)
).
equal(Term, Term).
一些示例查询:
?- [list_without].
true.
?- list_without([1,2,3], 4).
true.
?- list_without([1,2,3], 2).
false.
?- list_without([1,2,3], 3).
false.
?- list_without([1,2,3], 1).
false.
但这是一个相当奇怪的练习......
答案 2 :(得分:-1)
这将有效:
not_in( _ , [] ) . % By definition, the empty list contains nothing.
not_in( X , [X|_] ) :- % If the head of the non-empty list matches,
!, fail . % we fail with prejudice.
not_in( X , [_|L] ) :- % otherwise,
not_in( X , L ) % simply recurse down on the tail.
.
或者,你可以这样做:一个否定的,积极的测试:
is_member_of( X , [X|_]) . % Success! The head of the list matches the desired item.
is_member_of( X , [_|L]) :- % otherwise...
is_member_of( X , L ) % recurse down on the tail.
.
is_not_a_member_of( X , L ) :-
\+ is_member_of( X , L ) .