RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 941709
Accepted
zcorvid
zcorvid
Asked:2020-02-07 03:38:55 +0000 UTC2020-02-07 03:38:55 +0000 UTC 2020-02-07 03:38:55 +0000 UTC

如何使查询返回所有响应,而不仅仅是一个?

  • 772

我的代码:

parent(pamela, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, patricia).
parent(patricia, jim).
grandparent(X, Y) :- parent(X, Z), parent(Z, Y).

% Кто прародители Патриции?
query(X) :- grandparent(X, patricia).

在在线翻译器(链接)中,我提出了一个要求:

query(X).

作为回应,我得到:

X = pamela 

迷路的汤姆。如何让它显示所有的祖父母?

prolog
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Cost
    2020-02-07T13:19:53Z2020-02-07T13:19:53Z

    在与 Prolog 推理引擎对话的过程中,通过传递字符 可以得到下一个找到的解;。在此编辑器中,在输入字段中,您需要在输入字段中放置;下一行并通过单击按钮重新开始输出Run it [F8]。因此,如果输入字段如下所示:

    query(X).
    ;
    ;
    

    那么系统的响应将是

    X = pamela X = tom false.
    

    第一次找到结果pamela,第二次tom,第三次找不到新的解决方案,序幕会响应false。

    通常在一个问题中,需要找到所有可能的解决方案,而不是在与系统的对话过程中,而是直接在推理过程中。在这种情况下,使用内置谓词bagof之一setofor findall。

    谓词bagof(X, P, L)生成一个列表L,其中包含所有X为P真的对象。也就是说,如果在这个例子中我们问

    bagof(GParent, grandparent(GParent, patricia), Result).
    

    答案是

    Result = [pamela, tom].
    

    但是如果你没有指定 的确切值patricia,那么 Prolog 将找到所有解对并形成相应的列表。问题

    bagof(GParent, grandparent(GParent, Child), Result).
    ;
    ;
    

    我们会得到答案

    Child = ann,
    Result = [pamela, tom] Child = jim,
    Result = [bob] Child = patricia,
    Result = [pamela, tom].
    

    在 SWI-Prolog 中,相同的答案将更具描述性:

    ?- bagof(GParent, grandparent(GParent, Child), Result).    
    Child = ann,
    Result = [pamela, tom];
    Child = jim,
    Result = [bob];
    Child = patricia,
    Result = [pamela, tom].
    

    谓词setof是相似bagof的,但结果列表将被排序并且不包含重复项(如果有)。让我们稍微改变一下原来的例子,看看它们之间的区别(交换前两个谓词):

    parent(tom, bob).
    parent(pamela, bob).
    parent(tom, liz).
    parent(bob, ann).
    parent(bob, patricia).
    parent(patricia, jim).
    grandparent(X, Y) :- parent(X, Z), parent(Z, Y).
    

    然后

    bagof(GParent, grandparent(GParent, Child), Result).
    ;
    ;
    

    输出结果

    Child = ann,
    Result = [tom, pamela] Child = jim,
    Result = [bob] Child = patricia,
    Result = [tom, pamela].
    

    在第一个列表中tom并且pamela不是按字母顺序排列的,但是

    setof(GParent, grandparent(GParent, Child), Result).
    ;
    ;
    

    显示

    Child = ann,
    Result = [pamela, tom] Child = jim,
    Result = [bob] Child = patricia,
    Result = [pamela, tom].
    

    谓词findall(X, P, L)生成L所有X可以推断出目标的列表P。该列表L可能包含重复项。要求

    findall(GParent, grandparent(GParent, Child), Result).
    

    在问题的原始示例上将显示

    Result = [pamela, pamela, tom, tom, bob].
    

    Child如果你设置了确切的值而不是变量,那么bagof和之间没有区别findall(SWI-Prolog,在retexter解释器中,你需要去掉提示?-)

    ?- findall(GParent, grandparent(GParent, patricia), Result).
    Result = [pamela, tom].
    

    如果要得到一个L与谓词列表等价的列表findall,但不包含重复元素,可以使用^谓词中的操作setof(X, P, L)。这个操作告诉Prolog我们对目标中包含的变量之一的值不感兴趣P(SWI-Prolog,在retexter解释器中,我们需要去掉提示?-):

    ?- setof(GParent, Child ^ grandparent(GParent, Child), Result).
    Result = [bob, pamela, tom].
    
    • 2
  2. Best Answer
    coder675
    2020-02-07T05:22:52Z2020-02-07T05:22:52Z

    添加,写(X),nl,失败。在请求结束时。

    parent(pamela, bob).
    parent(tom, bob).
    parent(tom, liz).
    parent(bob, ann).
    parent(bob, patricia).
    parent(patricia, jim).
    grandparent(X, Y) :- parent(X, Z), parent(Z, Y).
    
    % Кто прародители Патриции?
    query(X) :- grandparent(X, patricia),write(X),nl,fail.
    

    查询(X)。问题

    帕梅拉
    汤姆
    假的。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5