Prolog - 在没有内置谓词的列表中查找项目

时间:2014-05-30 11:03:33

标签: list prolog

如果我搜索的元素不在列表中,我想创建一个TRUE的谓词。

没有任何内置谓词或算术结构。

我是prolog的初学者,目前我在oop语言中思考的方式太多了。

先谢谢你提前了。

3 个答案:

答案 0 :(得分:1)

list_without([], _).
list_without([E|Es], F) :-
   dif(E,F),
   list_without(Es, F).

最接近的人是否能得到。它确实使用dif/2这是一个内置的谓词。但没有其他方式可以以合理的方式表达不平等。有关详情,请参阅

此定义可以多种方式使用:

定期测试:

?- 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 ) .