prolog逻辑与cut
我在理解prolog的流程时遇到了一些问题。代码如下: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
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])
它失败了。