1

下面的代码有什么作用?

not(P) :- P, !, fail.
not(P).

以及它与以下 2 个代码的工作方式有何不同:

not(P) :- P, !, fail.
not(P) :- P, !.    
4

1 回答 1

1

这里是树:

树木

第一个程序(反转成功值P

如果调用P成功:

  1. 输入谓词 not(P)
  2. 输入谓词 not(P) 的第 1 句
  3. 呼叫(P) -->成功
  4. 横切
  5. 呼叫失败 -->失败
  6. 尝试回溯以找到替代解决方案
  7. 回溯的方式有一个Cut;以失败退出整个谓词(如果 P 成功,则谓词的 Cut+Fail 强制失败)

如果调用P失败:

  1. 输入谓词 not(P)
  2. 输入谓词 not(P) 的第 1 句
  3. 呼叫(P) -->失败
  4. 第 1 条导致 -->失败
  5. 试试备用条款 2
  6. 调用 True -->成功
  7. 没有什么可做的了;以Success退出谓词

第二个程序(总是失败)

如果调用P成功:

行为与第一个程序完全相同,使用Failure退出整个谓词。

如果调用P失败:

  1. 输入谓词 not(P)
  2. 输入谓词 not(P) 的第 1 句
  3. 呼叫(P) -->失败
  4. 第 1 条导致 -->失败
  5. 试试备用条款 2
  6. 呼叫(P) -->失败
  7. 没有什么可做的了;使用Failure退出谓词。实际上还有一个要遍历的切口,但它没有做任何事情。

尝试程序 1

请注意,not/1它已经是内置的,但我想我们可以在本练习中覆盖它。

?- [user].
|: not(P) :- P, !, fail.
|: not(P).

Warning: user://1:9:
Warning:    Singleton variables: [P]
|: % user://1 compiled 0.02 sec, 2 clauses
true.

好的

?- not(true).
false.

?- not(false).
true.

看起来挺好的。

尝试方案 2

?- [user].
|: not(P) :- P, !, fail.
|: not(P) :- P, !.    
|: % user://1 compiled 0.02 sec, 2 clauses
true.

?- not(true).
false.

?- not(false).
false.

看起来挺好的。

于 2020-06-11T15:01:30.947 回答