prolog逻辑与cut

prolog逻辑与cut,prolog,prolog-cut,Prolog,Prolog Cut,我在理解prolog的流程时遇到了一些问题。代码如下: h(X):- 1 is X mod 2, write(X), nl, 0 is X mod 3, !, fail. h(_). t(_,[],0). t(M,[_|LS],1):-member(M,LS),write('member'), nl,fail. t(_,[H|_],H). r([X|LS],R):-h(X), M is 2*X+1,t(M, LS, R), write(R), nl, fail. 现在我在运行3件事情: 1.r

我在理解prolog的流程时遇到了一些问题。代码如下:

h(X):- 1 is X mod 2, write(X), nl, 0 is X mod 3, !, fail.
h(_).
t(_,[],0).
t(M,[_|LS],1):-member(M,LS),write('member'), nl,fail.
t(_,[H|_],H).
r([X|LS],R):-h(X), M is 2*X+1,t(M, LS, R), write(R), nl, fail.
现在我在运行3件事情: 1.r([3,7,9],r)。 2.r([5,11,13],r)。 3.r([2,3,5],r)。 我无法理解我得到的答案。 答案是: 1.3. 错。 2.5. 11 错。 3.成员 3. 错


希望得到帮助

你期望得到什么样的答案?请注意,由于切割消除了回溯,因此切割后跟
fail
会导致“false”。因此,在您对
h/1
的定义中,如果
1是X mod 2
并且
0是X mod 3
成功,那么
h(X)
必然会失败,然后
h(X),M是2*X+1,
将永远无法通过
h(X)
查询。我不清楚您为什么要使用
!,在
h/1
中完全失败。这是一个很糟糕的方法来强制执行谓词子句是否适用的条件。谢谢。这实际上是一道考试题。我真的不明白这里的伤口有什么用处。。在r中([5,11,13],r)。为什么我得了11分?你读过Prolog的工作原理吗?您是否尝试过执行
跟踪。
然后运行查询以查看代码的功能?在进行
跟踪之前
最好了解回溯的含义以及回溯是如何成为基本的序言行为的。谢谢。我难以理解的是,为什么我们得到的是11..,而不是会员。h(X)对X=5感到满意,5被打印出来,然后我们继续使用t(11,[11,13],R),我们进入第二个角色,所以我不明白为什么我们要打印11,为什么不打印成员?因为您有
t(M,[u124; LS],1):-member(M,LS),write('member'),…
,所以
t(11,[11,13],R:
正在检查
member(11,[13])
它失败了。