如果对象在Obj中,我试图返回true,否则返回false。 但内置的成员函数不会给我真或假。 它给了我Obj如图所示。如何让它返回真或假?
member(communicator,Obj).
Obj = [communicator|_G3422].
答案 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
的变体:
true
或false
。这在计算机科学中被称为决策程序。在Prolog中,具有此属性的谓词称为半确定性。Obj=[communicator|_G3422]
示例)。以下代码实现了以下两个特性:
member_dp(X, L):-
is_list(L),
memberchk(X, L).