Prolog:成员谓词的真/假输出?
Prolog: true / false output of member predicate?
我想知道为什么 Prolog 的 member/2
谓词提供了多个备选方案(通过回溯?!),如果 true 已经统一为输出。
例如 member(1, [1,2,3]).
提供以下输出:
true ;
false.
为什么 member
return 已经发现原子 1
确实是列表 [1,2,3]
的成员?
更让我困惑的是以下输出:
?- member(1, [1,2,3,1]).
true ;
true.
在你的第一个例子中,你要求它证明member(1,[1,2,3]).
;因为它可以,所以它报告 true
。当您输入 ;
时,您要求找到另一种方法来证明该查询;因为它不能,它报告 false
.
在第二种情况下,第一个true
是因为它在列表中找到了1
之一;第二个是因为它找到了第二个。如果您再次点击 ;
,它会返回 false
,因为它没有其他方法来证明查询。 (注意:正如@WillNess 指出的那样,您实际上没有机会再次点击 ;
;这可能是由于 member
的实现使得 Prolog 知道没有剩余的选择。如果列表不是以 1 结尾,您可以再次点击 ;
。)
我想知道为什么 Prolog 的 member/2
谓词提供了多个备选方案(通过回溯?!),如果 true 已经统一为输出。
例如 member(1, [1,2,3]).
提供以下输出:
true ;
false.
为什么 member
return 已经发现原子 1
确实是列表 [1,2,3]
的成员?
更让我困惑的是以下输出:
?- member(1, [1,2,3,1]).
true ;
true.
在你的第一个例子中,你要求它证明member(1,[1,2,3]).
;因为它可以,所以它报告 true
。当您输入 ;
时,您要求找到另一种方法来证明该查询;因为它不能,它报告 false
.
在第二种情况下,第一个true
是因为它在列表中找到了1
之一;第二个是因为它找到了第二个。如果您再次点击 ;
,它会返回 false
,因为它没有其他方法来证明查询。 (注意:正如@WillNess 指出的那样,您实际上没有机会再次点击 ;
;这可能是由于 member
的实现使得 Prolog 知道没有剩余的选择。如果列表不是以 1 结尾,您可以再次点击 ;
。)