标签: Prolog
backtrackingprolog-cut
SWI Prolog中是否有任何内置谓词总是会失败并阻止机器回溯-它是停止程序立即执行(这不是fail/0所做的)?
我可以剪,但我不喜欢
执行类似于!,失败对我来说不是问题,但为了实现我想要的,我必须在更多的位置使用切割,这是我不喜欢的 太糟糕了,这就是削减的目的。你可以使用明确设计的机制来帮助你完成一些事情,但你不喜欢它
您可以始终使用not,这是cutfail的语法糖您可以使用异常。基于你的问题-它应该会有帮助。
参考想到两个备选方案:
通过要控制的代码传递回溯(true)或回溯(fals
好的,我使用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
river-crossing-puzzle
我是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中有上面的代码行,它基本上检查加号操作的类型
因此,当我在终点站进行以下查询时:
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中“。”是什么意思
我有以下代码:
Goal=.. [GoalPredicate|Pos]
我不知道“。”是什么意思这个操作符被称为“univ”,在GNU Prolog手册中有描述:
8.4.3(=…)/2-大学
模板
=..(+nonvar, ?list)
=..(-nonvar, +list)
描述
如果List是一个列表,其头部是与Term的主函子对应的原子,其尾部是Term的参数列表,则Term=…List成功
=..是预定义的中缀运算符(第8.14.10节)
描述该操
标签: Prolog
backtrackingtraveling-salesmanprolog-dif
我看过类似的问题,但找不到任何与我的问题相关的东西。我正在努力寻找一种算法或一组“循环”,它将使用一个数据库找到从CityA到CityB的路径
distance(City1,City2,Distance)
事实。到目前为止,我所做的工作如下所示,但它总是在write(X),处回溯,然后完成最后的迭代,这是我希望它做的,但只是在一定程度上
例如,我不希望它打印出任何死胡同的城市名称,或使用最终迭代。我想让它基本上创建一条从CityA到CityB的路径,在路径上写下它要去的城市的名称
我希望有人能
在我看过之后,我试着解决下面的问题。但我无法解决它。有人能帮我吗
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
有一个简单的序言插入排序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).
我试图写一个程序来确定一个句子是否是回文。这就是我到目前为止所做的:
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).
我在序言中完全是个书呆子。我正在做一项作业,在这里我创建了一个变化计数器,它可以以美分表示总的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
我需要帮助编写一个谓词来查找和删除列表中的最小元素
多谢各位 让我帮你搜索一下
无论如何,有一个很好的谓词
?- min_list([1,2,2,3],X).
X = 1.
下面是一个如何从列表中删除某些元素的小示例(请注意,所有2s都消失了):
如果只想删除元素的第一次,请使用:
所以你的最终答案可能是这样的:
delete_min(A, C) :-
min_list(A, B),
select(B, A, C), !.
及
同样,只需在列表上使用结构递归。
下面的实现将永远循环
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编程。我写了几个条款
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的新手,理解其中的一些内容有很大的困难。例如,我有一个“函数”:
smstofre([], []).
smstofre([T|R], [X|Y] :- frword(T,X), smstofre(R,Y).
使用以下“数据库”:
frword(bjr,bonjour).
这是用来把写得不好的法语句子翻译成正确的句子。
我是这样用的:
?- smstofre([bjr],E).
E = [bonjour].
这很酷,但我想创建一个“函数”,它将接受一个简单的字符串,拆分他的单
我就是想不起prolog这个问题。只是刚刚开始,但我似乎找不到一种方法来确定一个对象是否是唯一的。这是我的密码:
/* (Student Name, Student Number)*/
Student(stuart, 11234).
Student(ross, 11235).
Student(rose, 11236).
Student(stuart, 11237).
我怎样才能知道一个学生是否是独一无二的。以斯图尔特为例,有两个学生叫斯图尔特,所以斯图尔特不是独一无二的。我怎么能写一个程序来判
我有一个DCG语法,可以理解并同意如下短语:[john,Paint]和[john,likes,mary]通过使用参数直接将语义管理到DCG语法中
sentence2(VP) --> noun_phrase2(Actor),
verb_phrase2(Actor, VP).
noun_phrase2(Name) --> properName(Name).
verb_phrase2(Actor, VP) --> intrans_verb(Ac
按照四步抽象设计过程定义递归规则来计算数学函数。您必须指明(使用注释编码)所使用的步骤。注意,Prolog规则不返回值。您需要使用一个参数来保存返回值。您不能使用指数运算符**来计算表达式
编写一个递归规则factbar(F,X,Y,N)来计算F=((2*X+Y)^N)(expbar的阶乘)。规则必须调用(使用)您设计的规则expbar
现在,为了执行此操作,F=((2*X+Y)^N)我已经编写了我的代码,但我不知道如何在Prolog中编写阶乘:
expbar(R, X, Y, N) :-
我正在为自然推断编写一个校对程序,而我对列表中“更进一步”的部分证明有问题
首先,我读取一个文件等,然后调用引起问题的函数:
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代码:
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
比较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中的较
我想找到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) :-
这是一个谓词,它做它应该做的事情,即当DCG的一部分:
rest([H|T], [H|T], []).
rest([], [], []).
但我很难将其定义为DCG。。。还是完全可行
这当然不一样(尽管以相同的方式使用时也一样):
我之所以需要它,是因为rest//1是我需要解析输入的一组DCG规则的一部分。我可以做短语(foo(T),Input,Rest),但是我必须调用另一个短语(bar(T1),Rest)
假设我知道输入时只剩下一个我想要作为整数的数字串:
phrase(stuff_n(
我试图使用一个条件语句,如果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,
我得到一个数据库,我用谓词查询数据库
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
我试图编写一个函数,该函数接受两个列表,如果第一个列表中的每个元素在第二个列表中至少出现一次,则返回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的新手,正在尝试编写一个程序,以一个格式良好的命题公式返回原子。例如,查询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|_] ),
给定以下代码:
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
这是我想做的
鉴于宣言:
vertex(v0, coord(-1.0, 1.0, 0.0)).
vertex(v1, coord(1.0, 1.0, 0.0)).
vertex(v2, coord(-1.0, -1.0, 0.0)).
vertex(v3, coord(1.0, -1.0, 0.0)).
face(f0, v0, v1, v2).
face(f1, v0, v2, v3).
bidirEdge(A, B) :-
edge(A, B),
edge(B, A).
我希望此输出为字符串格式。
怎样才能做到呢
我得到的输出:
[[[[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
您可以使用和:
您可以使用和:
您可以使用和:
您可以使用和:
到目前为止你试过什么?问题在哪里?您正在构建
我在SWI Prolog中定义变量时遇到了一些奇怪(或者不是很奇怪)的问题。例如:
我想做如下事情:
:- initialization(main).
main :-
X = listing(main),
write(X).
但它只是简单地打印“listing(main)”您正在使用X=listing(…)创建一个术语,稍后您将使用write打印该术语
您似乎想访问main的代码。您正在寻找的是:
条款(:头、体)
如果Head可以与子句Head统一,Body可以与相应的子句Body统一,
标签: Prolog
clpfdmeta-predicateprolog-coroutining
问题是:
$ 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
我想在序言中描述以下事实和规则:
尼克正在用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
我想生成整数,我正在寻找最好的方法。例如:
?- number2(N).
N = 0;
N = 1;
N = 2;
...
(and so on)
现在我只使用length/2:
number2(N) :- length(_, N).
但我认为应该有更好的方法(不创建临时列表)。我可能自己可以根据length/2的代码编写一些代码,但我正在寻找使用现有内置谓词的解决方案。是否有任何内置谓词比length/2更有效?我找不到任何类似的解决方案。卡洛解决方案的一种尾部递归替代方案是:
next_
这是一个2人从列表中删除数字的游戏。如果玩家选择了最后一个号码,玩家将失败。根据删除列表中数字的两条规则
有一个问题,
写一个谓词win(S),如果S是
轮到他上场的球员,否则将失败。此外
如果给出正确答案,您的代码应该避免计算
同一位置不止一次。例如,只有960个
从[30,30]可以达到的位置,但要进行数十亿次游戏
可以从那里开始演奏
我真的很困惑[30,30]怎么能达到960个位置。根据这两条规则,如果我只从一个元素中减去N,我只能达到60个状态
Y = [29, 30] or Y
是否可以使用retract的返回值
我只想让函数打印出单词,而不是布尔值,
因此,我尝试比较retract值来打印语句,但它似乎不起作用。谓词retract/1可以成功或失败,就像任何其他谓词一样
在上面的示例中,当评估测试。时,收回(a)成功,因此将评估写入(“…”),该写入总是成功。
在那之后,一个削减,所以我们不能回到第二条
在本例中,assert(a)被注释掉后,retract(a)失败,因此我们进入了test/0的第二个子句,它成功地编写了“a为false”。您有一个示例说明您正在
我有一个巨大的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
在我的项目中,我需要建立一个可能的移动列表。我已经这样做了,但我需要从以前的动作中筛选可能的动作。我该怎么做
发件人:
致:
我尝试了delete,\+memberchk,但没有成功。也许我做错了什么。这个问题实际上与迷宫无关,它只是将列表中的所有元素从另一个列表中删除。这有一个谓词:
减法(+Set,+Delete,-Result)
删除“从集合中删除”中的所有元素。删除基于使用memberchk/2的统一
用法示例:
?- subtract([1,2,5,4,3,5,4], [6,2,4],
标签: Prolog
clpfddcgmeta-predicate
我被问到以下问题:
任何整数列表都可以(唯一地)分解为“奇偶运行”,其中每个运行是原始列表中连续偶数或奇数的(最大)序列。例如,列表
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
predicatebidirectional
为了一项任务,我不得不在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(
我想将非确定性目标的解决方案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
所以我试图转换一种语法,它在编程语言中定义变量定义。这是我第一次写每一个序言,它和典型的语言非常不同,所以我很困惑。语法如下:
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).
我想创建一个谓词除数(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(
我对以下结果感到困惑。我正在使用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
我想问一下,如果这个程序是尾部递归的,如果不是,我如何使它是尾部递归的
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
我需要用有限个元素初始化一些列表,所有这些都是一样的
fill( 0, [], _ ) :- !.
fill( Index, [Value|List], Value ) :-
NextIndex is Index - 1,
fill( NextIndex, List, Value ).
为了避免无限递归和失败结果,必须进行切割
我试图修改规则#2,但在给出预期解决方案后,目标失败:
fill( Index, [Value|List], Value ) :-
Index
我有我的代码在一个给定的网格中从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
以下代码和查询不起作用:
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来做一个解决方案,但是
我不知道如何用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。因此,我编写了以下代码:
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 页