prolog相关内容
我是逻辑编程和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
..
flatten([A|B],R):- (islist(A)->(flatten(A,R1),R=R1);(write(A),append([A],R1,R))), flatten(B,R1). flatten(X,X). islist([_|_]). 这是我写的代码,但我有奇怪的问题.. 我得到 257 ?- flatten([1,[],2,[3],[3,[3,5]
..
我是PROLOG的初学者,我的第一个任务是实现一个函数Construction(),它从一个列表构建一棵二叉树。我知道我的代码中有错误或遗漏了什么,但我不能确定是什么。我也认为帮助器方法可能是必要的,但我想不出该怎么做。 到目前为止,我的代码如下: construct([],nil). construct(E, tree(E,nil,nil)). construct([H|T], tree(
..
在DCG中如何实现:零或多、零或一、一或多个实例? 我说的是伪代码中的以下内容: sentence --> word+ float --> int+, ['.'], int+ nilORa --> a? nilORaaaa --> a* 推荐答案 您可以使用谓词的子句集(或者,在本例中,同一个Dcg的非终结符的dcg产生式集合--dcg产生式是Horn子句的
..
下面的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
..
基于一些较早的post,我有一些PROLOG程序,它指定命题。让我们称其为";logic.pl"; :-op(800, fx, ¬). :-op(801, xfy, ∧). :-op(802, xfy, ∨). :-op(803, xfy, →). :-op(804, xfy, ↔). :-op(800, xfy, #). m_Proposition_Binary_x_y
..
所以我才刚刚开始使用Prolog。 假设我有一个数字列表,如下所示: X = [0,1,0,1,1,1,1,0] 并且希望将这些数字打印到屏幕上,而不使用逗号、空格或换行符,如下所示: ?- write(X). 01011110 到目前为止,我已经尝试使用write(X)。它只打印数组,我使用pprint模块尝试了print_term,但没有取得任何成功。 现在我有
..
我在这里看到了一些使用它的答案,但我不知道它是什么意思,也不知道如何使用它。我也很难通过搜索引擎找到它:) 推荐答案 它是“not provable”运算符。如果其参数不可证明,则它成功(如果其参数可证明,则失败)。
..
有没有办法在PROLOG中确定列表中元素的类型?我知道在PROLOG中没有显式键入变量,但我需要检查元素是数字还是特定字符等。如何才能做到这一点? 推荐答案 prolog定义了一组用于类型测试的内置谓词:var/1、atom/1、integer/1、float/1、atomic/1、compound/1、nonvar/1、number/1,如果您了解该语言的数据类型,所有这些谓词的含义
..
这是 回答关于对术语的特定参数进行排序的问题,而不为 keysort 创建新列表(如果我正确理解了原始问题). 假设我们希望 predsort/3 的行为与 sort/2 完全相同:如果我理解正确,这意味着将其称为: ?- predsort(比较,列表,排序). 现在说我们想使用 predsort/3 来按照 msort/2 的实现进行排序(另请参阅此 问题).一种方法是定义一个比较谓词
..
根据我所在大学的逻辑课程,我们可以预期与 Prolog 为以下查询定义的结果不同: 追加([], a, X) (统一为 X=a). 但是我不明白他们的目标是什么?考虑到 append 应该为(在本例中)[] 和 a 的串联统一 X,应该期望什么作为有效响应? 我假设他们可能期望返回 false 或 [a];但是我认为这应该是连接 a 和 [] 而不是 [] 和 a 的结果(因为[]
..
这不是家庭作业问题,而是考试学习指南问题.Prolog 与 Haskell 中的模式匹配有什么区别? 我已经进行了一些研究并阅读了它们背后的理论并没有真正让我对两者之间有一个扎实的理解.我在Prolog中读到,模式匹配是不同的,因为它具有统一变量的能力,因此能够通过分辨率进行推断并吐出可能的答案 例如 ?- [a,b] = [a,X]X = b 现在我不确定如何在 Haskell 中显示
..
与我在大学学习 Prolog 的程序员一样多,但只学过很少.我知道Prolog和Datalog密切相关,但Datalog更简单?另外,我相信我读到 Datalog 不依赖于逻辑子句的顺序,但我不确定为什么这是优势.CLIPS 应该是完全不同的,但它太微妙了,我无法理解.有人可以提供这些语言相对于其他语言的一般亮点吗? 解决方案 datalog 是prolog 的一个子集.datalog 携
..
自从我 3 年前在 A.I. 上过一堂课以来.我显然足够熟练地问这个问题......开玩笑吧开玩笑;) 但说真的,是什么让这些语言如此受人工智能欢迎.研究.尽管 A.I.研究是“陈旧的"......它可能是过去 5-10 年来最长的方式......是不是因为这些语言在某种程度上是围绕人工智能的概念“设计"的?,或者只是我们现在没有什么更好的东西可以使用? 我问这个是因为我一直觉得它很有
..
Prolog 比 Haskell 更能解决哪些问题?这两种语言的主要区别是什么? 编辑 是否有可以模仿 Prolog 功能的 Haskell 库(一种逻辑求解器)? 解决方案 Prolog 主要是针对逻辑问题的语言,尤其是在 AI 和语言领域.Haskell 更像是一种通用语言. Prolog 是声明性(逻辑)语言,这使得在其中陈述逻辑问题变得更容易.Haskell 是一
..
我必须编写一个谓词 stepup(L, Z, X),其中 L 是一个列表,而 Z 和 >X 是整数.如果 Z 可以使用列表中用户给出的合法步骤进入 X,则它应该返回 true. 例如 stepup([7, 12, 19], 6, 32) 应该返回 true 因为 6 + 7 + 7 + 12 = 32起始编号应始终为 Z(此处为 6),并且规则应仅使用列表中的步骤.该规则适用于所有尺寸
..
我使用 swi prolog.我有一个像这样的事实基础,其中包含 4 的事实. 属性(a1,a2,a3,a4).数据(是,否,否,否).数据(是,否,是,否).数据(是,是,是,否).数据(是,是,是,是).数据(不,是,是,是). 当我调用 pbayes(yes,no,no,no,Result); 时,我的代码会计算 Result 的概率; p(ColumnName,ColumnValue
..
我需要一个谓词last_two(LST,Y,Z)将列表的最后一个值分配给 Z倒数第二个到 Y.我怎样才能在递归中做到这一点?我怎么能在尾递归中做到这一点?谢谢! 这是一个带有尾递归的代码,我可以让它更高效吗? last2_2([_|[H1|[H2|T]]],Y,Z):-last2_2([H1|[H2|T]],Y,Z).最后2_2([H1,H2],H1,H2). 解决方案 你可以简化递归
..
如何在 Prolog 中制作一个包含 n 个 a 和 n 个 b 的程序,这里需要注意的是列表中 a 和 b 的数量必须相等,并且列表必须始终以 a 开头并以 b 结束,否则为假.示例:[a,b] 为 true,[a,a,a,b,b,b] 为 true, [a,a,a,a] 是 false 并且 [a,a,a,b,b] 也是假. 这是我尝试做的: 语言B([b]).语言B([b | S])
..
您可以使用 =.. 来转换简单的术语. ?- x(a,b,c) =.. A.A = [x, a, b, c]. 复杂的术语呢: x(a,b(c,d)) ==>[x,a,[b,c,d]]x(a,b(c,q(d))) ==>[x,a,[b,c,[q,d]]] 然后作为单独的任务,我想用改变的函子重新生成条款: x(a,b(c,d)) ==>[x,a,[b,c,d]] ==>y(a,f(c,d
..