Prolog,失败,不回溯

SWI Prolog中是否有任何内置谓词总是会失败并阻止机器回溯-它是停止程序立即执行(这不是fail/0所做的)? 我可以剪,但我不喜欢 执行类似于!,失败对我来说不是问题,但为了实现我想要的,我必须在更多的位置使用切割,这是我不喜欢的 太糟糕了,这就是削减的目的。你可以使用明确设计的机制来帮助你完成一些事情,但你不喜欢它 您可以始终使用not,这是cutfail的语法糖您可以使用异常。基于你的问题-它应该会有帮助。 参考想到两个备选方案: 通过要控制的代码传递回溯(true)或回溯(fals

Prolog 应添加哪些DCG规则?

好的,我使用prolog来构建一个简单的xml解析器。我有以下xml文件: 以下是我得到的: program_state( ip(line(7), envt(p1)), contour(name(main), items(item(var(x), val(2)), item(var(y), val(2))), rpdl(system), nested(contour(name(p1),

Prolog 食人族和传教士

我是prolog的新手,并开始学习prolog。 我发现传教士和食人族的谜题在序言中很有趣。我已经研究了很多论坛,发现了这个链接,我认为这是一个很好的解决方案。但有些人认为我没有得到实际的结果。输出上的移动似乎是错误的。我试图跟踪程序,在赋值过程中,一切似乎都很完美,但不知何故,解决方案是错误的 我需要专家的帮助,以了解逻辑错误的确切位置 来源:正如我们在帖子评论中所讨论的,没有逻辑错误,只是选择了错误的输出格式

Prolog 如何动态创建列表并设置其值

例如,如果N为2,它将创建下面的列表并设置其值 L = [S1,S2], L :: 1..10. L = [S1,S2,S3], L :: 1..10. 如果N为3,它将装箱并设置其值 L = [S1,S2], L :: 1..10. L = [S1,S2,S3], L :: 1..10. 非常感谢:)您正在寻找类似的smth吗 list( N, List ) :- numlist( 1, N, List ). 哪个牌子 ?- list(5, L). L = [1, 2, 3,

prolog中的错误

我在Prolog中有上面的代码行,它基本上检查加号操作的类型 因此,当我在终点站进行以下查询时: lookup([(X,A)|_],X,A). lookup([_|L],X,A) :- lookup(L,X,A). hi(_,t,bool). hi(_,f,bool). hi(g,var(X),Y) :- lookup(g,X,Y). hi(_,in(X),int). hi(_,fl(X),real_exp). hi(g,plus(A,B),int) :- hi(g,A

Prolog 序言双周期

在Prolog中“。”是什么意思 我有以下代码: Goal=.. [GoalPredicate|Pos] 我不知道“。”是什么意思这个操作符被称为“univ”,在GNU Prolog手册中有描述: 8.4.3(=…)/2-大学 模板 =..(+nonvar, ?list) =..(-nonvar, +list) 描述 如果List是一个列表,其头部是与Term的主函子对应的原子,其尾部是Term的参数列表,则Term=…List成功 =..是预定义的中缀运算符(第8.14.10节) 描述该操

Prolog中的简化旅行推销员

我看过类似的问题,但找不到任何与我的问题相关的东西。我正在努力寻找一种算法或一组“循环”,它将使用一个数据库找到从CityA到CityB的路径 distance(City1,City2,Distance) 事实。到目前为止,我所做的工作如下所示,但它总是在write(X),处回溯,然后完成最后的迭代,这是我希望它做的,但只是在一定程度上 例如,我不希望它打印出任何死胡同的城市名称,或使用最终迭代。我想让它基本上创建一条从CityA到CityB的路径,在路径上写下它要去的城市的名称 我希望有人能

Prolog 将函数结果映射到另一个

在我看过之后,我试着解决下面的问题。但我无法解决它。有人能帮我吗 predefined : foo( X, Y ) bar( Y, Z ) ^ ^ ^ ^ all of them is atomic, that is they only return or take one value at a time sample example: foo(john, brad). bar(j

Prolog 序言插入排序

有一个简单的序言插入排序alghoritm: sorting([A|B], Sorted) :- sorting(B, SortedTail), insert(A, SortedTail, Sorted). sorting([], []). insert(A, [B|C], [B|D]) :- A @> B, !, insert(A, C, D). insert(A, C, [A|C]). 它在正常列表中表现良好: ?- sorting([5, 4, 9, 1, 3, 8], X).

Prolog 确定一个句子在序言中是否是回文

我试图写一个程序来确定一个句子是否是回文。这就是我到目前为止所做的: palindrome :- write('Sentence: '), read(Word), name(Word,List), palCheck(List). palCheck(List) :- reverse(List,List). reverse(L1,L2) :- rev(L1,[],L2). rev([],L,L). rev([H|L],L2,L3) :- rev(L,[H|L2],L3).

Prolog 成员谓词问题,兑换一美元

我在序言中完全是个书呆子。我正在做一项作业,在这里我创建了一个变化计数器,它可以以美分表示总的S,0你错过了美分!我建议使用/3之间来表示范围: ..., between(0,100,Cents), ..., ..., S is 50*H + 25*Q +10*D + 5*N + Cents, ..., 测试: WRT error存在错误\u错误。。。我想你需要编译你的脚本 ..., between(0,100,Cents), ..., ..., S is 50*H + 25*Q +10*

Prolog 序言:如何查找和删除最小列表元素?

我不熟悉Prolog 我需要帮助编写一个谓词来查找和删除列表中的最小元素 多谢各位 让我帮你搜索一下 无论如何,有一个很好的谓词 ?- min_list([1,2,2,3],X). X = 1. 下面是一个如何从列表中删除某些元素的小示例(请注意,所有2s都消失了): 如果只想删除元素的第一次,请使用: 所以你的最终答案可能是这样的: delete_min(A, C) :- min_list(A, B), select(B, A, C), !. 及 同样,只需在列表上使用结构递归。

Prolog 如何从列表中随机选择元素?

下面的实现将永远循环 pick_nums(0,_,_). pick_nums(Count,From,To) :- random_member(X,From), ( member(X,To) -> pick_nums(Count,From,To) ; C1 is Count-1, pick_nums(C1,From,[X|To]) ) . ?- numlist(1,9,X), pick_nums(3,X,Y). 这里的问题是,在pick\u nums(Co

新手:无法跟踪表达式错误中的自由变量。Prolog编程

刚开始用Prolog编程。我写了几个条款 predicates parent(symbol,symbol) male(symbol) female(symbol) mother(symbol,symbol) father(symbol,symbol) brother(symbol,symbol) sister(symbol,symbol) uncle(symbol,symbol) clauses parent(arthur,fred). parent(arthur,george). parent

Prolog 使用函数的返回

我是Prolog的新手,理解其中的一些内容有很大的困难。例如,我有一个“函数”: smstofre([], []). smstofre([T|R], [X|Y] :- frword(T,X), smstofre(R,Y). 使用以下“数据库”: frword(bjr,bonjour). 这是用来把写得不好的法语句子翻译成正确的句子。 我是这样用的: ?- smstofre([bjr],E). E = [bonjour]. 这很酷,但我想创建一个“函数”,它将接受一个简单的字符串,拆分他的单

Prolog 如何判断对象是否唯一

我就是想不起prolog这个问题。只是刚刚开始,但我似乎找不到一种方法来确定一个对象是否是唯一的。这是我的密码: /* (Student Name, Student Number)*/ Student(stuart, 11234). Student(ross, 11235). Student(rose, 11236). Student(stuart, 11237). 我怎样才能知道一个学生是否是独一无二的。以斯图尔特为例,有两个学生叫斯图尔特,所以斯图尔特不是独一无二的。我怎么能写一个程序来判

Prolog中三变量表达式的求值

按照四步抽象设计过程定义递归规则来计算数学函数。您必须指明(使用注释编码)所使用的步骤。注意,Prolog规则不返回值。您需要使用一个参数来保存返回值。您不能使用指数运算符**来计算表达式 编写一个递归规则factbar(F,X,Y,N)来计算F=((2*X+Y)^N)(expbar的阶乘)。规则必须调用(使用)您设计的规则expbar 现在,为了执行此操作,F=((2*X+Y)^N)我已经编写了我的代码,但我不知道如何在Prolog中编写阶乘: expbar(R, X, Y, N) :-

Prolog 为什么不统一呢?(序言)

我正在为自然推断编写一个校对程序,而我对列表中“更进一步”的部分证明有问题 首先,我读取一个文件等,然后调用引起问题的函数: validate([q],[[1, q, premise],[[2, p, assumption],[3, q, copy(1)]], [4, imp(p,q), impint(2,3)]]. 通过检查trace,我知道以下调用失败: validate([[1, q, premise], q], [[[2, p, assumption], [3, q, copy(1)

Prolog深度优先搜索?

我为深度优先搜索编写了以下Prolog代码: dfs(OPEN,CLOSE,END):- OPEN=[],!,fail ; OPEN=[X|_],X=END,!,true ; getChildren(X,[],ChL),CLOSE2=[X|CLOSE],add(ChL,OPEN,CLOSE2,OPENF), dfs(OPENF,CLOSE2,END). getChil

Prolog中最多2个数字

比较2个数字:定义一个谓词great,它包含3个参数-2 我想要比较的数字和返回 数量最多 前 用Prolog语言你真的应该这样做。甚至可以读一本: =/2大于或等于 =你是说序言吗?还是有一种叫做“brolog”的Prolog的“bro”变体-对不起,这是我的fault@Sergey真有趣D@user3527224你有没有看过任何文件?在线查找GNU Prolog或SWI Prolog的Prolog手册,并查看比较运算符。然后考虑你的谓词great(X,Y,Z):-…的意思是X是Y和Z中的较

在SICStus prolog中使用wordNet语法集

我想找到wordNet中最顶级的语法集(最高级别),如何找到它们?我怎么知道每个最上面的语法集下面有多少个Dauther语法集?通常我们使用hyp关系来做这件事,我试着写: hyp(I, J), %[I would like to write here, be sure that there is no parent for I]. 你能帮我一下吗?所有顶级事实: root_hyp(H) :- hyp(H, _), \+ hyp(_, H). 树叶没有孩子: leaf_hyp(L) :-

Prolog 与其余输入匹配的DCG

这是一个谓词,它做它应该做的事情,即当DCG的一部分: rest([H|T], [H|T], []). rest([], [], []). 但我很难将其定义为DCG。。。还是完全可行 这当然不一样(尽管以相同的方式使用时也一样): 我之所以需要它,是因为rest//1是我需要解析输入的一组DCG规则的一部分。我可以做短语(foo(T),Input,Rest),但是我必须调用另一个短语(bar(T1),Rest) 假设我知道输入时只剩下一个我想要作为整数的数字串: phrase(stuff_n(

Prolog中的模

我试图使用一个条件语句,如果N是dosomething,否则就做别的事情。 下面是我正在执行的代码的某些部分: (N,Lines,1):-write(N),nl, ( mod(N,2) = 0 -> write('Hello'),nl,write('Again Hello') ; foo(N,Lines) ). 但即使我给出N=6,它也会进入foo(N,行)即else部分。它不进入if部分。有人能告诉我哪里错了吗?不要写成mod(N,2)=0write0是mod(N,

在Prolog中不使用findall/3查找查询的所有匹配项

我得到一个数据库,我用谓词查询数据库 findmin(A,B,course(X,Y)):- course(X,Y),X >= A,Y =< B. 现在,我想使用自己的findall,而不是使用标准的findall/3谓词 finda(X,findmin(A,B,X),L) 如果我使用的递归总是将我带到数据库的开头,我就不知道如何递归地使用findmin在数据库中给我不同的引用。实现这一点的一种方法是使用带有副作用的故障驱动循环。在findall实现的情况下,大致可以这样实现: f

Prolog全成员函数

我试图编写一个函数,该函数接受两个列表,如果第一个列表中的每个元素在第二个列表中至少出现一次,则返回true。例如: allMember(X, [a,b]). X = [] ; X = [a] ; X = [b] ; X = [a a] ; X = [a b] ; X = [b a] ; X = [b b] ; false. 麻烦的是,在决赛之后;程序无限循环检查每个可能的列表。我怎样才能解决这个问题 allmember([], _). allmember([F

在命题公式中返回原子的Prolog程序

我是prolog的新手,正在尝试编写一个程序,以一个格式良好的命题公式返回原子。例如,查询ats(and(q,imp(or(p,q),neg(p)))As.应该返回[p,q]作为As。下面是我的代码,它将公式返回为as。我不知道如何将中的单个F拆分为ats中的F1和wff中的F2,因此永远不会调用wff/2。请帮我从这里开始。谢谢 代码 logical_atom( A ) :- atom( A ), atom_codes( A, [AH|_] ),

Prolog clpfd-域的约束上键必须是元素列表的最大值

给定以下代码: solve(G,L) :- G = [A0,B0,C0,D0], L = [A1,B1,C1,D1,A2,B2,C2,D2,A3,B3,C3,D3,A4,B4,C4,D4], G ins 0..4, L ins 0..max(G). 我想约束L不包含高于G中包含的最大值的值,但使用此语法时会出现“域错误”。有没有其他方式来表达这一点?基本上,你的思路是正确的。但是lins0..max(G)不起作用,因为传递给ins/2的边界需要是整数或inf或s

以句子形式Prolog输出

我希望此输出为字符串格式。 怎样才能做到呢 我得到的输出: [[[[a]|fat]|man],[[[[[was]|walking]|quickly],to],[[[[the]]|end],[of,[[[the]|long]|corridor]]]]] 预期产出: a fat man was walking quickly to the end of the long corridor 您可以使用和: 您可以使用和: 您可以使用和: 您可以使用和: 到目前为止你试过什么?问题在哪里?您正在构建

在prolog中访问程序列表

我在SWI Prolog中定义变量时遇到了一些奇怪(或者不是很奇怪)的问题。例如: 我想做如下事情: :- initialization(main). main :- X = listing(main), write(X). 但它只是简单地打印“listing(main)”您正在使用X=listing(…)创建一个术语,稍后您将使用write打印该术语 您似乎想访问main的代码。您正在寻找的是: 条款(:头、体) 如果Head可以与子句Head统一,Body可以与相应的子句Body统一,

Prolog 使用带有'length/2'的约束变量`

问题是: $ swipl Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.6-5-g5aeabd5) Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistrib

Prolog 序言-描述事实和规则

我想在序言中描述以下事实和规则: 尼克正在用Java编程 尼克正在用Python编程 Nick与任何使用Java和Python编程的人都是朋友 吉姆正在用尼克所用的所有语言编程 我找到了1、2和3的解决方案,但没有找到第4个,尽管我真的很感激完整的解决方案 我的解决方案: male(Nick). male(Jim). programming(Nick, java). programming(Nick, python). friends(X,Y):- programming(X,j

在Prolog中生成整数的最佳方法

我想生成整数,我正在寻找最好的方法。例如: ?- number2(N). N = 0; N = 1; N = 2; ... (and so on) 现在我只使用length/2: number2(N) :- length(_, N). 但我认为应该有更好的方法(不创建临时列表)。我可能自己可以根据length/2的代码编写一些代码,但我正在寻找使用现有内置谓词的解决方案。是否有任何内置谓词比length/2更有效?我找不到任何类似的解决方案。卡洛解决方案的一种尾部递归替代方案是: next_

Prolog 序言;“获胜位置”;

这是一个2人从列表中删除数字的游戏。如果玩家选择了最后一个号码,玩家将失败。根据删除列表中数字的两条规则 有一个问题, 写一个谓词win(S),如果S是 轮到他上场的球员,否则将失败。此外 如果给出正确答案,您的代码应该避免计算 同一位置不止一次。例如,只有960个 从[30,30]可以达到的位置,但要进行数十亿次游戏 可以从那里开始演奏 我真的很困惑[30,30]怎么能达到960个位置。根据这两条规则,如果我只从一个元素中减去N,我只能达到60个状态 Y = [29, 30] or Y

如何在prolog中使用retract布尔值?

是否可以使用retract的返回值 我只想让函数打印出单词,而不是布尔值, 因此,我尝试比较retract值来打印语句,但它似乎不起作用。谓词retract/1可以成功或失败,就像任何其他谓词一样 在上面的示例中,当评估测试。时,收回(a)成功,因此将评估写入(“…”),该写入总是成功。 在那之后,一个削减,所以我们不能回到第二条 在本例中,assert(a)被注释掉后,retract(a)失败,因此我们进入了test/0的第二个子句,它成功地编写了“a为false”。您有一个示例说明您正在

prolog中角色的分离度

我有一个巨大的prolog演员数据库,例如 actor('adam_zweibel','the_story_of_us',1999,20). actor('alan_zweibel','north',1994,10). actor('alan_zweibel','the_story_of_us',1999,21). actor('darrell_zwerling','...and_justice_for_all',1979,32). actor('darrell_zwerling','capri

在Prolog中筛选列表的元素

在我的项目中,我需要建立一个可能的移动列表。我已经这样做了,但我需要从以前的动作中筛选可能的动作。我该怎么做 发件人: 致: 我尝试了delete,\+memberchk,但没有成功。也许我做错了什么。这个问题实际上与迷宫无关,它只是将列表中的所有元素从另一个列表中删除。这有一个谓词: 减法(+Set,+Delete,-Result) 删除“从集合中删除”中的所有元素。删除基于使用memberchk/2的统一 用法示例: ?- subtract([1,2,5,4,3,5,4], [6,2,4],

Prolog代码,用于将列表的部分拆分为连续的偶数部分和奇数部分

我被问到以下问题: 任何整数列表都可以(唯一地)分解为“奇偶运行”,其中每个运行是原始列表中连续偶数或奇数的(最大)序列。例如,列表 List=[8,0,4,3,7,2,-1,9,9] 可以分为[8,0,4],[3,7],[2]和[-1,9,9] 编写一个谓词paruns(List,RunList),将数字列表转换为相应的奇偶校验运行列表。例如: ?- paruns([8,0,4,3,7,2,-1,9,9], RunList). RunList = [[8, 0, 4], [3, 7], [2]

Prolog双向谓词

为了一项任务,我不得不在Prolog中创建家庭关系,我偶然发现了这个问题 man(john). woman(lisa). married(john,lisa). ?- married(john,X). X = lisa. ?- married(X,john). false. 如何使这个谓词以两种方式工作? 如果约翰嫁给了丽莎,那么丽莎就是嫁给了约翰 对于事实,我只能使用性别、父母和婚姻: man(john). woman(lisa). parent(john,steve). parent(

在Prolog中枚举解

我想将非确定性目标的解决方案nondet_-goal成对枚举(索引,值),其中Index是返回的每个值的索引。我用nb_setval,nb_getval这样做: nb_setval(g_idx, 0), findnsols(3, (Idx, Val), (nondet_goal(Val), nb_getval(g_idx, Idx), Idx1 is Idx + 1, nb_setval(g_idx, Idx1)), Out). L = [a,b,c,d,e], nb_setval(g_idx

将语法转换为prolog

所以我试图转换一种语法,它在编程语言中定义变量定义。这是我第一次写每一个序言,它和典型的语言非常不同,所以我很困惑。语法如下: S->T S|T T->char F分号| int F分号 F->id | id G G->逗号F 因此,对于“char-id分号”或“int-id-comma-id分号char-id分号”这样的事情,它实际上会返回true 我试图把它变成一个prolog程序来识别这个语法。到目前为止,我得到的是: type([char|T],T). type([int|T],T).

求一个数的所有自然因子(用Prolog)

我想创建一个谓词除数(X,[Y]),如果 十> 1和Y是X的所有除数的列表,从X开始一直到1 我现在的代码是什么样子的: divisors(1,[1]). divisors(X,[Y,Z|Ys]) :- X>0, Y is X, Y>Z, divides(X,[Z|Ys]). divides(X,[Y,Z|Ys]) :- Y>Z, 0 is X mod Y, divides(X,[Z|Ys]). divides(

Prolog bagof/3是不可预测的

我对以下结果感到困惑。我正在使用SWI Prolog ?- bagof(Q, (Q=A, (A=[a,_] ; A=[_,b])), X). A = [_G16898, b], X = [[_G16898, b]] ; A = [a, _G16892], X = [[a, _G16892]]. 请注意,[a,[u]和[[u,b]并不统一以生成答案a=[a,b],X=[[a,b],[a,b] 现在,让我们对算术约束进行同样的尝试: ?- bagof(Q, (Q=A, (A in 1..5 ; A

这个prolog程序是尾部递归的吗?

我想问一下,如果这个程序是尾部递归的,如果不是,我如何使它是尾部递归的 euclidsqr([], [], 0). euclidsqr([X|Xs], [Y|Ys], ED) :- euclidsqr(Xs, Ys, ED1), ED is ED1 + (X-Y)*(X-Y). 下面是相应的尾部递归版本: euclidsqr(Xs, Ys, ED) :- euclidsqr(Xs, Ys, 0, ED). euclidsqr([], [], ED,ED). euclidsq

Prolog 填充列表(作为一个数组):如果不使用cut,回溯将在给出正确的产品后导致无限递归

我需要用有限个元素初始化一些列表,所有这些都是一样的 fill( 0, [], _ ) :- !. fill( Index, [Value|List], Value ) :- NextIndex is Index - 1, fill( NextIndex, List, Value ). 为了避免无限递归和失败结果,必须进行切割 我试图修改规则#2,但在给出预期解决方案后,目标失败: fill( Index, [Value|List], Value ) :- Index

找到答案后,Prolog寻路陷入循环

我有我的代码在一个给定的网格中从a点到B点找到所有可能的解决方案,我的问题是在找到所有的解决方案后,它将开始永远地来回追踪。我想这是合法的,因为所有的条件都满足了。然而,我很难给出一个条件来防止这种情况。有什么帮助吗 move([X,Y], e, [X1,Y]) :- X1 is X+1. move([X,Y], n, [X,Y1]) :- Y1 is Y+1. move([X,Y], s, [X,Y1]) :- Y1 is Y-1. safe([Xn,Yn],[Xg,Yg]) :- Xg

Prolog 开场白中的99瓶啤酒

以下代码和查询不起作用: bottles(X) :- write(X), write(' bottles of beer on the wall,'), nl, write(X), write(' bottles of beer,'), nl, write('Take one down, and pass it around,'), nl, X1 is X - 1, write(X1), write(' bottles of beer on the wal

用CNF表示知识库和prolog解析

我有一个CNF的知识库,我想用prolog来做一个解决方案,但是 我不知道如何用prolog来表达这个问题 我有 KB = { P v Q, Q => (R ^ S), (P v R) => U } 我在CNF中填写如下内容: KB = { P v Q, not(Q) v R, not(Q) v S, not(P) v U, not(R) v U } 我想证明KB包含U(KB |=U) 我可以通过反驳手动证明,但我想知道如何使用prolog实现这一点 答案是:这是不可能的 非(Q

Prolog 序言错误:源文件中的子句不在一起

我对序言很陌生。我学习它是因为我的讲师给我们的学生讲授声明式编程,并要求我们学习Prolog。因此,我编写了以下代码: suami(andi, maya). anak(rini, ayah(andi), ibu(maya)). anak(winda, ayah(andi), ibu(maya)). suami(hari, rini). anak(karna, ayah(hari), ibu(rini)). suami(gibran, winda). anak(barni, ayah(gibr

  1    2   3   4   5   6  ... 下一页 最后一页 共 115 页