Prolog会员功能

时间:2014-04-06 15:12:22

标签: prolog

如果对象在Obj中,我试图返回true,否则返回false。 但内置的成员函数不会给我真或假。 它给了我Obj如图所示。如何让它返回真或假?

member(communicator,Obj).
Obj = [communicator|_G3422].

3 个答案:

答案 0 :(得分:1)

从评论中听起来你并没有关注Prolog如何在提示下工作。

如果你输入:

?- Obj = [communicator, gun].
Obj = [communicator, gun].

它在一段时间内结束,然后Prolog将满足此查询,用Obj实例化[communicator, gun]并显示最终解决方案:Obj = [communicator, gun].

此时,表达式已完成,Obj在找到解决方案后不再具有值。随后对member/2的调用显示了这一点:

?- member(communicator, Obj).
Obj = [communicator|_G51] ;

您需要做的是在同一逻辑子句中实例化Obj

?- Obj = [communicator, gun], member(communicator, Obj).
Obj = [communicator, gun] ;
false.

?-

注意逗号,它是Prolog中的AND。 Prolog成功并找到了一个解决方案(Obj = [communicator, gun],然后,在您输入;以查找更多解决方案之后,它再找不到并显示false

答案 1 :(得分:0)

一些提示:

?- List = [a,b,c], member(Obj, List).
List = [a, b, c],
Obj = a ;
List = [a, b, c],
Obj = b ;
List = [a, b, c],
Obj = c.

你看到&#39 ;;'我要求Prolog通过可用解决方案回溯。 现在应该清楚

?- List = [a,b,c], member(communicator, List).
false.

因为communicator它不是List的成员。但

?- List = [a,b,communicator,c], member(communicator, List).
List = [a, b, communicator, c] ;
false.

找到元素并通知我这个事实,显示可用的绑定List = [a, b, communicator, c]。然后它等待我选择,如果搜索更多,我给&#39 ;;'和Prolog告诉我,没有另一个communicator的实例。

HTH

答案 2 :(得分:0)

您要求member/2的变体:

  1. 返回truefalse。这在计算机科学中被称为决策程序。在Prolog中,具有此属性的谓词称为半确定性
  2. 不会实例化变量列表参数(例如您的Obj=[communicator|_G3422]示例)。
  3. 以下代码实现了以下两个特性:

    member_dp(X, L):-
      is_list(L),
      memberchk(X, L).