Prolog 中的这个谓词有什么问题?

发布于 2024-10-19 15:09:44 字数 415 浏览 6 评论 0原文

        findThree([H|T],_,3).    
        findThree([H|T], M, Z):-
            ( member(H,M)
              -> Z2 is Z + 1,
              select(H,M,C),
              findThree(T,C,Z2)
              ;select(H,M,C),
              findThree(T,C,Z)
            ).

所以,我想做的是查看某个元素是否在指定列表中。如果是,我会增加一些变量,并在找到其中 3 个元素时停止。然而,这似乎对我不起作用——这是我的语法问题吗?我正在尝试在 SWI-Prolog 中使用 If-else 结构;这可能是问题所在吗?

        findThree([H|T],_,3).    
        findThree([H|T], M, Z):-
            ( member(H,M)
              -> Z2 is Z + 1,
              select(H,M,C),
              findThree(T,C,Z2)
              ;select(H,M,C),
              findThree(T,C,Z)
            ).

So, what I'm trying to do is see if an element is in a specified list. If it is, I increment some variable, and stop if I found 3 of those elements. However, this does not seem to be working for me- is it a problem with my syntax? I'm trying to use an If-else construct in SWI-Prolog; could that be the issue?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

断爱 2024-10-26 15:09:44

Z is Z + 1 对于整数总是失败;它将计算 Z + 1 的值,然后尝试将其与 Z 统一。由于 Z 通常不会与 Z + 1 具有相同的值,因此 is 将失败。您需要创建一个新变量 Z2,使用 Z2 is Z + 1,然后使用 Z2 而不是 Z代码> 在相关地方。

获取您的代码并进行修复:

findThree(_,_,3).  % This should allow anything as the first element

findThree([H|T], M, Z) :-
  select(H, M, C), Z2 is Z + 1, findThree(T, C, Z2). % select includes member implicitly
findThree([_|T], M, Z) :-
  findThree(T, M, Z). % Allow this second case since it simplifies the code

Z is Z + 1 will always fail for integers; that will compute the value of Z + 1 and then try to unify it with Z. Since Z will generally not have the same value as Z + 1, the is will fail. You will need to create a new variable Z2, use Z2 is Z + 1, and then use Z2 instead of Z in relevant places.

Taking your code and making fixes:

findThree(_,_,3).  % This should allow anything as the first element

findThree([H|T], M, Z) :-
  select(H, M, C), Z2 is Z + 1, findThree(T, C, Z2). % select includes member implicitly
findThree([_|T], M, Z) :-
  findThree(T, M, Z). % Allow this second case since it simplifies the code
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文