首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在findall/setof中的Prolog多个谓词

在findall/setof中的Prolog多个谓词
EN

Stack Overflow用户
提问于 2016-03-11 03:07:38
回答 1查看 2.9K关注 0票数 2

我试图用以下事实和规则(简化)来寻找希腊神话缪斯的祖先:

代码语言:javascript
运行
复制
/* parent(A, B) - A is the parent of B */
parent(zeus, calliope).
parent(zeus, clio).
parent(zeus, melpomene).
parent(zeus, euterpe).
parent(zeus, erato).
parent(zeus, terpsichore).
parent(zeus, urania).
parent(zeus, thalia).
parent(zeus, polymnia).
parent(mnemosyne, calliope).
parent(mnemosyne, clio).
parent(mnemosyne, melpomene).
parent(mnemosyne, euterpe).
parent(mnemosyne, erato).
parent(mnemosyne, terpsichore).
parent(mnemosyne, urania).
parent(mnemosyne, thalia).
parent(mnemosyne, polymnia).

parent(kronos, zeus).
parent(rheia, zeus).
parent(oranos, kronos).
parent(gaia, oranos).

muse和祖先规则定义为:

代码语言:javascript
运行
复制
/* A is a Muse if A's parents are Zeus and Mnemosyne */
muse(A):- parent(zeus, A), parent(mnemosyne, A).
/* A is the ancestor of B if A is the parent of B */
ancestor(A, B):- parent(A, B).
/* A is an ancestor of C if A is the parent of B and B is the ancestor of C */
ancestor(A, C):- parent(A, B), ancestor(B, C).

我主要想做以下几点:

代码语言:javascript
运行
复制
/* Get the set of ancestors A of muses B and store in Z*/
setof(A, ancestor(A, muse(B)), Z).

这不起作用,并返回false。我尝试过的另一个变体是:

代码语言:javascript
运行
复制
findall(B, muse(B), Muses),
setof(A, ancestor(A, Muses), Z).

但是,考虑到我有更多的parent事实,它只是遍历每一个可能的ancestor包。

我尝试的最后一个变体是:

代码语言:javascript
运行
复制
setof(A, ancestor(A, member(X, muse(X)), Z).

但这一错误有以下几点:

代码语言:javascript
运行
复制
ERROR: Syntax error: Operator expected
ERROR: setof(A, ancestor(A, member(X, muse(X)), Z)
ERROR: ** here **
ERROR: .

这很有道理。

我希望能够写出结果,例如:

代码语言:javascript
运行
复制
write('The Muses ancestors are: '), write(MuseAncestors), nl.

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-11 05:36:11

要将复合目标传递给以目标为参数的谓词,只需将其放在括号中即可:

代码语言:javascript
运行
复制
setof(X, ( G1, G2 ), Xs).

至于你的复合目标:也许最好问一问:

缪斯的祖先是谁?

代码语言:javascript
运行
复制
?- muse(M), ancestor(A, M).

你需要把目标连在一起。任何介绍性的Prolog文本都应该解释连接的含义,以及为什么ancestor(A, muse(M))不是您的意思。

记住,如果你写:

代码语言:javascript
运行
复制
?- setof(A, ( muse(M), ancestor(A, M) ), As).

您将为M留出一个空闲变量,并为该变量的每个可能绑定提供一组解决方案。为了避免这种情况,您可以显式地告诉Prolog不要尝试绑定它:

代码语言:javascript
运行
复制
?- setof(A, M^( muse(M), ancestor(A, M) ), As).
As = [gaia, kronos, mnemosyne, oranos, rheia, zeus].
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35931496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档