prolog相关内容

永无止境的填充方法,返回答案但不退出的无限循环

所以我正在编写一些序言,并且遇到了一个我不明白为什么会出现的问题.这个问题实际上发生在我的一些方法中,但希望我能通过这种方法的一些指导来解决它. fill(3,a,L) ->L = [a,a,a] 这是我的代码 填充(0,x,​​[]).填充(N,A,[A | As]):-N1 是 N-1,填充(N1,A,As). 解决方案 第一个子句应该是: fill(0, _, []). 您的代 ..
发布时间:2022-01-12 10:36:12 其他开发

找出四个 10 的所有表达式

我遇到了一个 CS 问题. 问题在于递归地找出 ((10+10)/(10+10)) 形式的哪些表达式产生一个数字.例如,((10+10)/(10+10)) 产生 1.使用运算符 +、-、*、/,以及 4 个 10 和括号的所有组合来查找所有其他表达式以强制执行顺序操作. 我被提到了反向波兰表示法,但它依赖于后缀表示法,这不是解决这个问题所必需的. 我有一些伪代码是这样的.我知道使 ..
发布时间:2022-01-12 10:36:02 C/C++开发

DCG prolog 测试几句

如果我有以下代码,我将如何让它产生 Answer= 5 和 Answer2= 10?.我运行目标 ?- test(Data),lpsolve(Data, [Answer1,Answer2]). :-use_module(library(clpfd)).test([the, variable, X, is, 五,fullstop,的,变量,Y,是,十,句号]).lpsolve(Data, [An ..
发布时间:2022-01-12 10:35:55 其他开发

Prolog 中的关联列表

我的任务是用列表实现地图.我们将关联列表定义如下: [] 是列表,k 是键,v 是值,a 是关联列表,那么 [[k, v] |a] 是一个关联列表. 所以现在我必须编写一个谓词,在其中检查给定参数是否是关联列表.例如: ?- 测试([[a,5]]).->是的.,?-测试([[1],[2]]).->错误的. 我真的很绝望,我希望有人可以帮助我 问候 解决方案 我可以说 ..
发布时间:2022-01-12 10:35:46 其他开发

Peano算术中的`less/2`关系

Peano 算术中的这个小于谓词 less(0, s(_)).更少(s(X),s(Y)):-更少(X,Y). 循环时 ?-less(X, Y), X=s(0), Y=0. 有没有更好的方法来编写 less/2(仅使用 Horn 子句)? 解决方案 你可以使用when/2.使它不再是一个无限枚举的谓词,并且仍然保持 100% 的纯正.when/2 修改SLD-Resolution,一 ..
发布时间:2022-01-12 10:35:38 其他开发

Prolog:为什么我的谓词返回错误?

所以我写了一个谓词来计算一个元素在列表列表中出现的次数. count([], _, 0).#基本情况count([[Elem|Rest]|OtherLists], Elem, Count) :- #Elem 是子列表的头部!,count([Rest|OtherLists], Elem, NewCount),成功(新计数,计数).count([[_|Rest]|OtherLists], Elem, ..
发布时间:2022-01-12 10:34:14 其他开发

Prolog 可能删除列表中的元素

我被要求尝试搜索所有可能的结果,从列表中的任何单个元素中删除任何数字. 例如,如果我有一个列表 X = [1,2,3] 移除(X, Y) 我的结果是: Y = [2,3]Y = [1,1,3]Y = [1,3]Y = [1,2,2]Y = [1,2,1]Y = [1,2] 为此,我已经编写了 2 个解决方案,但我真的不知道我的解决方案有什么缺点.我的教授一直告诉我有更好的方法来做到这 ..
发布时间:2022-01-12 10:33:56 其他开发

Prolog 中 `if_/3` 运算符的目标扩展

我正在编写一个标记器,我想使用 if_/3 来保留logical-purity 在我的代码中. 代码在左边看起来像下面的代码1...但我希望它看起来像右边的代码. if_(Cond1_1, % ( Cond1_1然后1, % *=> 然后1if_(Cond2_1, % ; Cond2_1然后2, % *=> 然后2if_(Cond3_1, % ; Cond3_1然后3, % *=> 然后3 ..
发布时间:2022-01-12 10:33:47 其他开发

PROLOG中的递归?

鉴于以下 Prolog 事实: f(a, [b]).f(b, [c]).f(c, [d]).f(d, [e]).f(e, []). 我需要创建一个查询 xyz(a,Y) 以便得到 Y = [e,d,c,b],因为 a 依赖于 b,这取决于 c 等.我目前的查询是: xyz(X,Y):-f(X,P),成员(Y,[P]). 但是,xyz(a,Y) 的这个查询只给我 Y = [b],而不是 b ..
发布时间:2022-01-12 10:33:38 其他开发

Prolog 图路径搜索与循环路径

我是 Prolog 的新手.我试图找出一个问题,我需要检查边缘之间是否存在路径.我完成了循环的非循环图形代码,我的代码将进入无限循环. path(Start, End) :- edge(Start, End).路径(开始,结束):- 边缘(开始,Z),路径(Z,结束). 我需要通过定义一个新的谓词来处理这种情况:新路径(开始,结束,路径)这应该消除无限循环.请让我知道如何进行. 解决方案 ..

可以在prolog中模拟一个简单的CPU吗?

我的理解是,CPU 的简单模型是状态机. 当我查看 prolog 时,它似乎是树搜索(或图形搜索)组合,同时在约束处停止运行,直到找到它的目标. 有人告诉我,您可以在 prolog 中模拟一个简单的 CPU. 是否可以在 prolog 中像简单的 CPU 一样表示状态机模型? 解决方案 Prolog 是图灵完备的语言,因此您可以在其中表达任意计算,包括对 CPU 的模拟. ..
发布时间:2022-01-12 10:33:17 其他开发

Prolog中事实的持久性

我是 Prolog 的新手,我正在使用 SWI-Prolog v6.6 将断言存储在 *.pl 文件中. :- 动态事实/2.断言(事实(事实 1,事实 2)). 使用上面的代码,我可以进行断言并且工作正常,但问题是当我关闭 SWI-Prolog 并再次打开 *.pl 文件时,我所做的断言是走了…… 有没有办法做出断言,即使我退出 Prolog 进程,这些断言也会被存储? 抱歉我的 ..
发布时间:2022-01-12 10:33:07 其他开发

如何在序言中打印所有数据库事实

我在 prolog 中有一个数据库,我要做的就是枚举它的元素并一一打印.如何做到这一点? 事实(是(迈克,哮喘)).事实(有(安迪,高压)).事实(是(迈克,吸烟者)). 我写了这个,它工作正常,但它从数据库中删除元素,所以我想访问它们而不删除. 打印:-收回(事实A(P)),写(事实A(P)),nl,失败.打印. 解决方案 你也可以考虑使用 forall/2 谓词: 打印:-fora ..
发布时间:2022-01-12 10:32:50 其他开发

如何使用 Prolog 删除 List 中的偶数

我需要删除第一个列表中的所有偶数并将其余的保存到第二个列表.我的第一个非工作方法是: remove_even([],[]).remove_even([H1|T1],[H2|T2]):-H1 mod 2 =:= 0,删除偶数(T1,_).remove_even([H1|T1],[H2|T2]):-删除偶数(T1,T2). 示例查询,使用 SWI-Prolog 7.1.37 运行: ?- rem ..
发布时间:2022-01-12 10:32:34 其他开发

Prolog 在单独的数据库文本文件中插入、修改和删除事实

我有一个包含大量事实 knowledge.pl 的 prolog 数据库文件.例如: father_of(乔,保罗).父亲(乔,玛丽).母亲(简,保罗).母亲(简,玛丽).男(保罗).男(乔).女(玛丽).女(简).% 等等. 每次再次执行我的程序时都会查阅此文件 (consult/1). 我希望能够通过直接在此数据库文本文件中写入或删除来插入、修改和删除我想要的事实(其中一些是直接的, ..
发布时间:2022-01-12 10:31:51 其他开发

如果直接插入,为什么 Prolog 会将变量与失败的结果匹配?

我正在制作一个 Prolog 程序来查找一组列表的子集.这个子集必须匹配一些特定的条件,其中一个方面是子集的列表不能相同.令我困惑的是,当我尝试为变量 X 找到匹配项时,如果我将它们插入查询中而不是 X,它会生成返回 false 的结果.例如: ?- containsSet(2, [[3],[7],[7]], X).X = [[3], [7]] ;X = [[3], [7]] ;X = [[7] ..
发布时间:2022-01-12 10:31:44 其他开发

是否可以声明升序列表?

我可以像这样制作升序整数列表: ?- findall(L,between(1,5,L),List). 我知道我也可以使用以下方法生成值: ?- 长度(_,X). 但我认为我不能在 findall 中使用它,就像下面的循环一样: ?- findall(X,(length(_,X),X 我还可以使用 clpfd 生成一个列表. :- use_module(library(clpfd)). ..
发布时间:2022-01-12 10:31:31 其他开发

如何避免在Prolog中使用assert和retractall来实现全局(或状态)变量

我经常在 Prolog 中编写代码,其中涉及一些算术计算(或整个程序中重要的状态信息),首先获取存储在谓词中的值,然后重新计算值,最后使用 retractall 和 assert 因为在 Prolog 中我们不能使用 is 为变量赋值两次(因此几乎所有需要修改的变量都是全局变量).我开始知道这在 Prolog 中不是一个好习惯.对此我想问: 为什么在 Prolog 中这是一种不好的做法(尽管 ..
发布时间:2022-01-12 10:31:24 其他开发

Prolog 是否使用 Eager 评估?

因为 Prolog 使用时间顺序回溯(来自 Prolog Wikipedia 页面)即使在找到答案之后(在此示例中只能有一个解决方案),这是否可以证明 Prolog 使用热切评估是合理的? mother_child(特鲁德,莎莉).父亲孩子(汤姆,莎莉).父亲孩子(汤姆,艾丽卡).父亲孩子(迈克,汤姆).兄弟(X,Y):-父子(Z,X),父子(Z,Y).父子(X,Y):-父子(X,Y).父子(X ..
发布时间:2022-01-12 10:31:06 其他开发

prolog中的幂函数

我的幂函数出了什么问题? pow(_,0,1).pow(X,Y,Z) :-pow(X,Y-1,X*Z).?- pow(2,3,Z).错误:超出全局堆栈 解决方案 你的 Y 没有递减,你不能使用函数之类的谓词.您还必须将 Z 与乘法的结果统一. pow(_,0,1).pow(X,Y,Z) :- Y1 是 Y - 1,pow(X,Y1,Z1),Z 是 Z1*X. 还有一个内置的幂函数会更快: ..
发布时间:2022-01-12 10:30:56 其他开发