failure-slice相关内容
我是逻辑编程和PROLOG的新手。以下PROLOG程序定义了一个谓词mul/3,用于将第一个参数与第二个参数相乘,从而产生第三个参数,该谓词的基础是等效于(x−1)*y+y=z: mul(0, _, 0). mul(X, Y, Z) :- ground(X), succ(U, X), add(V, Y, Z), mul(U, Y, V). mul(X, Y, Z) :- va
..
下面的Prolog程序定义了一个谓词deleted/3,用于从传入的第二个参数的列表中删除传入第一个参数的项目的所有匹配项,并生成传入的第三个参数的列表: deleted(_, [], []). deleted(X, [X|Y], Z) :- deleted(X, Y, Z). deleted(U, [V|W], [V|X]) :- deleted(U, W, X), U = V
..
下面的 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)
..
我必须编写 parse(Tkns, T),它以记号列表的形式接受数学表达式并找到 T,并返回表示抽象语法的语句,尊重操作顺序和关联性. 例如, ?- parse( [ num(3), plus, num(2), star, num(1) ], T ).T = 加(整数(3),乘(整数(2),整数(1)));不 我尝试如下实现 + 和 * parse([num(X)], integer(
..
当 F 是第 N 个斐波那契数时,术语 fib(N,F) 为真. 以下 Prolog 代码通常对我有用: :-use_module(library(clpfd)).纤维(0,0).纤维(1,1).纤维(N,F):-N#>1、N#=<F + 1,F#>= N-1,F#>0,N1 #= N - 1,N2 #= N - 2,F1 #= 在执行此查询时(在 SICStus Prolog 中),找
..
我需要使用自然数为 2 的幂创建一个 Prolog 谓词.自然数有:0、s(0)、s(s(0))等等…… 例如: ?- pow2(s(0),P).P = s(s(0));错误的.?- pow2(P,s(s(0))).P = s(0);错误的. 这是我的代码: times2(X,Y) :-添加(X,X,Y).pow2(0,s(0)).pow2(s(N),Y) :-pow2(N,Z),次2
..
我需要从列表的头部或尾部找到列表中的最大整数.我已经编写了一个可以从头部找到最大的程序,现在我需要一些帮助才能从尾部开始. 这是我目前所拥有的: 最大([X],X).最大([X|Xs],X):- 最大(Xs,Y),X>=Y.最大([X|Xs],N):- 最大(Xs,N),N>X. 请记住,这会从头部找到最大的整数,我需要它从尾部开始工作.感谢您的帮助. 解决方案 等一下!在继续之
..
(让我在期中问题的浪潮中潜入.) 两个自然数之和的常见定义是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 中编写 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). 循环.为了更
..
在回答关于 StackOverflow 的另一个问题关于(概括一点)生成由有限元素集形成的所有序列,没有重复出现. 正如鲍里斯在评论中正确指出的那样,这个问题有许多现有的解决方案.但是,我对不使用累加器(即,要与新选择的元素进行比较的已选择元素的列表)但使用 dif/2 语句的解决方案感兴趣. 为了说明,在我的以下程序中,我有 4 个元素,并且在 4 次递归调用之后,有几个 div/2
..
我希望我的程序找到整数 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,
..
我得到了以下程序: edge(a,b).边(b,c).边(a,d).路径(N,M):- 路径(N,New),edge(New,M).路径(N,M):-边(N,M). 并询问是否将证明树算法应用于以下查询: ?- 路径(a,X). 证明树是无限成功树,还是无限失败树? 现在,在我看来,在构建树的过程中,您会陷入一遍又一遍地应用路径规则 1,创建一棵无限树并且永远不会达到路径规则 2..
..
线索 四位客人(Mustard 上校、Plum 教授、Scarlett 小姐、Green 女士)参加了在 Boddy 先生家中举办的晚宴.突然,灯灭了!当他们回来时,博迪先生死在桌子中央.每个人都是嫌疑人.经过进一步检查,发现以下事实: 博迪先生与格林女士有染. Plum 教授与 Green 女士结婚. 先生博迪非常富有. Mustard 上校非常贪婪. 思嘉小姐也与博迪先生有
..
我正在尝试实现一个 dcg,它采用一组 {a,b,c,d}* 形式的字符串.我遇到的问题是,如果我有一个 s([a,c,b],[]),它返回true这是正确的答案但是当我有一个s([a,c,f],[])形式的查询时,它不返回一个答案并且它用完了本地堆栈. s -->[].s -->s,数量.数量 -->[一种].数量-->[乙].数量-->[C].数量-->[d]. 解决方案 使用 phra
..
我必须找出列表中的两个成员是否相邻.限制是使用 append/3 谓词.到目前为止,我已经完成了下面的工作,如果它是真的,它就可以工作,否则我得不到答案,就像它永远运行一样. 相邻(X,Y,L):-追加(L1,[X,Y],T1),追加(T1,T2,L). 解决方案 要查看您的程序是否会循环,只需考虑以下 failure-slice: 相邻(X,Y,L): -追加(L1,[X,Y],T1),
..
我正在尝试制作一个函数,将可变长度的列表按顺序拆分为三个偶数长度的列表.下面将其分为三部分,但进程将它们一次一个地插入到每个列表中. 我想要的一个例子是: [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]. 以下代码通过一次向每个列
..
我的目的是在 Prolog 中实现一个简单的传递性示例(仅针对我自己). 这些是我的事实: trust_direct(p1, p2).trust_direct(p1, p3).trust_direct(p2, p4).trust_direct(p2, p5).trust_direct(p5, p6).trust_direct(p6, p7).trust_direct(p7, p8).tru
..
我想使用 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)似乎会停滞.有时以前,在这里提出了类似的
..
假设我们有以下谓词(这是来自 在 Prolog 中编程): [F0] isInteger(0).[F1] isInteger(X):- isInteger(Y), X 是 Y+1. 查询的第一个结果是Integer(R),标记放在F0,会返回R=0 如果用户按下;,标记放置在 F1,我们移动到 subgoal(isInteger(Y),满足 F0) 和 R=1. 我明白了上面的内容
..