failure-slice相关内容

如何在所有参数模式的后继算术中实现阶乘序列?

下面的 Prolog 程序定义了一个谓词 fact/2,用于在后续算术中计算整数的阶乘: 事实(0,s(0)).事实(s(X),Y):-事实(X,Z),产品(s(X),Z,Y).产品(0,_,0).产品(s(U),V,W):-总和(V,X,W),产品(V,U,X).总和(0,Y,Y).总和(s(X),Y,s(Z)):-总和(X,Y,Z). 它适用于这种参数模式下的查询: ?- 事实(s(0) ..

在 Prolog 中解析表达式并返回抽象语法

我必须编写 parse(Tkns, T),它以记号列表的形式接受数学表达式并找到 T,并返回表示抽象语法的语句,尊重操作顺序和关联性. 例如, ?- parse( [ num(3), plus, num(2), star, num(1) ], T ).T = 加(整数(3),乘(整数(2),整数(1)));不 我尝试如下实现 + 和 * parse([num(X)], integer( ..
发布时间:2022-01-12 10:25:29 其他开发

Prolog从尾部找到列表中的最大整数

我需要从列表的头部或尾部找到列表中的最大整数.我已经编写了一个可以从头部找到最大的程序,现在我需要一些帮助才能从尾部开始. 这是我目前所拥有的: 最大([X],X).最大([X|Xs],X):- 最大(Xs,Y),X>=Y.最大([X|Xs],N):- 最大(Xs,N),N>X. 请记住,这会从头部找到最大的整数,我需要它从尾部开始工作.感谢您的帮助. 解决方案 等一下!在继续之 ..
发布时间:2022-01-12 10:07:55 其他开发

s(X)-sum 的更好终止

(让我在期中问题的浪潮中潜入.) 两个自然数之和的常见定义是nat_nat_sum/3: nat_nat_sum(0, N, N).nat_nat_sum(s(M), N, s(O)) :-nat_nat_sum(M, N, O). 严格来说,这个定义太笼统了,因为我们现在也成功了 ?- nat_nat_sum(A, B, unnatural_number). 同样,我们得到以下答案 ..

Prolog 后继符号产生不完整的结果和无限循环

我开始学习 Prolog 并首先了解了后继符号. 这就是我了解如何在 Prolog 中编写 Peano 公理的地方. 请参阅 PDF 的第 12 页: sum(0, M, M).总和(s(N),M,s(K)):-总和(N,M,K).产品(0,M,0).产品(s(N),M,P):-产品(N,M,K),总和(K,M,P). 我将乘法规则放入 Prolog.然后我进行查询: ?- pr ..

为什么在定义转换两个原子关系的谓词时会出现堆栈限制超出错误?

我想知道为什么在这些情况下程序会无限递归: ?- 爱(凯,阿曼达). 和 ?- love(rob, amanda). 这是代码: 爱(阿曼达,凯).爱(凯,地理).爱(地理,抢劫).爱(X,Y): -爱(X,Z),爱(Z,Y).爱(X,Y): -爱(Y,X). 解决方案 首先,您的程序总是进入无限循环.无论您使用什么名称.甚至 ?- love(amanda, kay). 循环.为了更 ..

如何使用 diff/2 防止生成序列中的重复?

在回答关于 StackOverflow 的另一个问题关于(概括一点)生成由有限元素集形成的所有序列,没有重复出现. 正如鲍里斯在评论中正确指出的那样,这个问题有许多现有的解决方案.但是,我对不使用累加器(即,要与新选择的元素进行比较的已选择元素的列表)但使用 dif/2 语句的解决方案感兴趣. 为了说明,在我的以下程序中,我有 4 个元素,并且在 4 次递归调用之后,有几个 div/2 ..
发布时间:2021-06-22 19:01:47 其他开发

在序言中陷入无限循环

我希望我的程序找到整数 1,2,...,N 的所有大小为 K 的子集. 为此,我写了以下 subs(N,X,Y) 表示 X 是集合 Y 的大小为 N 的子集.我定义如下: subs(0,[],X).subs(N,[A|R1],[A|R2]):-N>0,N1为N-1,subs(N1,R1,R2).subs(N,[A|R1],[B|R2]):-subs(N,[A|R1],R2).subs(N, ..
发布时间:2021-06-22 19:00:43 其他开发

一个无限的成功树,或者不是?

我得到了以下程序: edge(a,b).边(b,c).边(a,d).路径(N,M):- 路径(N,New),edge(New,M).路径(N,M):-边(N,M). 并询问是否将证明树算法应用于以下查询: ?- 路径(a,X). 证明树是无限成功树,还是无限失败树? 现在,在我看来,在构建树的过程中,您会陷入一遍又一遍地应用路径规则 1,创建一棵无限树并且永远不会达到路径规则 2.. ..
发布时间:2021-06-22 19:00:02 其他开发

Prolog - 规则是正确的,但没有按照预期的方式输出?

线索 四位客人(Mustard 上校、Plum 教授、Scarlett 小姐、Green 女士)参加了在 Boddy 先生家中举办的晚宴.突然,灯灭了!当他们回来时,博迪先生死在桌子中央.每个人都是嫌疑人.经过进一步检查,发现以下事实: 博迪先生与格林女士有染. Plum 教授与 Green 女士结婚. 先生博迪非常富有. Mustard 上校非常贪婪. 思嘉小姐也与博迪先生有 ..
发布时间:2021-06-22 18:59:59 其他开发

DCG 和左递归

我正在尝试实现一个 dcg,它采用一组 {a,b,c,d}* 形式的字符串.我遇到的问题是,如果我有一个 s([a,c,b],[]),它返回true这是正确的答案但是当我有一个s([a,c,f],[])形式的查询时,它不返回一个答案并且它用完了本地堆栈. s -->[].s -->s,数量.数量 -->[一种].数量-->[乙].数量-->[C].数量-->[d]. 解决方案 使用 phra ..
发布时间:2021-06-22 18:59:42 其他开发

查找相邻成员

我必须找出列表中的两个成员是否相邻.限制是使用 append/3 谓词.到目前为止,我已经完成了下面的工作,如果它是真的,它就可以工作,否则我得不到答案,就像它永远运行一样. 相邻(X,Y,L):-追加(L1,[X,Y],T1),追加(T1,T2,L). 解决方案 要查看您的程序是否会循环,只需考虑以下 failure-slice: 相邻(X,Y,L): -追加(L1,[X,Y],T1), ..
发布时间:2021-06-22 18:58:58 其他开发

使用 Prolog 按顺序将单个列表拆分为三个

我正在尝试制作一个函数,将可变长度的列表按顺序拆分为三个偶数长度的列表.下面将其分为三部分,但进程将它们一次一个地插入到每个列表中. 我想要的一个例子是: [1, 2, 3, 4, 5] ->[1, 2], [3, 4], [5] 另一个例子是: [8, 7, 6, 5, 4, 3, 2, 1] ->[8, 7, 6], [5, 4, 3], [2, 1]. 以下代码通过一次向每个列 ..
发布时间:2021-06-22 18:57:17 其他开发

prolog dcg 限制

我想使用 DCG 作为生成器.截至目前,语法是 s-->a,b.a-->[].a-->a,c.c-->[t1].c-->[t2].b-->[t3].b-->[t4]. 我想生成所有s,其中a的长度是. 使用?-短语(a,X),length(X,Y),Y我可以得到少于4个项目的所有a.但是,当所有组合都用完时,系统(SWI-Prolog 6.2.5)似乎会停滞.有时以前,在这里提出了类似的 ..
发布时间:2021-06-22 18:52:33 其他开发

递归谓词中的回溯

假设我们有以下谓词(这是来自 在 Prolog 中编程): [F0] isInteger(0).[F1] isInteger(X):- isInteger(Y), X 是 Y+1. 查询的第一个结果是Integer(R),标记放在F0,会返回R=0 如果用户按下;,标记放置在 F1,我们移动到 subgoal(isInteger(Y),满足 F0) 和 R=1. 我明白了上面的内容 ..
发布时间:2021-06-22 18:52:14 其他开发