我已经按照下面的说明在我的linux机器上设置并安装了interprolog和swi prolog :
我已经将unixVariables.sh编辑为包含机器上的java和swi-prolog(pl)可执行文件的路径,并且我的unixVariables.sh如下所示:
# This is a typical environment for Linux, see elsewhere for Mac OS X
JAVA_BIN=/usr/lib/jvm/java-6-sun-1.6.0.16/bin
XSB_BIN_DIRECTORY=/home/YOUR_NAME/XSB271/config
我是prolog编程的新手,在一篇教程中被告知要定义一个结构列表(在脚本中),这样我就可以将其作为数据库进行查询。但是,我发现不可能在脚本中将此列表定义为变量。当我定义一个列表时,比如
X=[a,b,c].
我刚收到一条错误消息
No permission to modify static_procedure `(=)/2'
prolog不支持定义这样的变量吗?我在linux下使用SWI-Prolog。
我得到了一个很大的旧程序文件集合,我想在64位Linux下使用7.2 Swi-prolog设置。这些报告中的大多数是
import/1: No permission to import clpfd:transpose/2 into user (already imported from ugraphs)
错误,命名冲突的结果,因为当前版本引入了默认加载ugraph的新行为,并选择它而不是用户实际指定的模块,据我所知。
我希望Prolog更喜欢显式使用的模块,而不是默认值。如果做不到这一点,我想定制这个默认加载的模块列表。
其他答案建议从use_module中排除所需的谓词,然后将其与显式名称空
这是一个Prolog程序,我想检查Linux包之间的依赖关系,以及是否存在冲突。
dep(gnome1,gcc7).
confl(gcc7,gcc8).
% recursive chain dependency
depend(X,Y):- dep(X,Y).
depend(X,Y):- dep(X,Z), depend(Z,Y).
% conflict(X,Y) holds if X and Y depend
on two packages which conflict, conflict between two
packages should be a symmetric relatio
SELECT * FROM v$version;
*Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
"CORE 12.1.0.2.0 Production"
TNS for Linux: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production* 我有一个使用XML的示例查询,如下所示: with t(xm
我遇到过这样的切割,如果图Graph的某个节点B存在边A-B或B-A,则它应该返回true。 node(A,Graph) :- adjacent(A,_,Graph),!. 问题是,我不明白为什么删除此切割会对返回的解决方案产生任何影响。 据我所知,Prolog语句的cut at the end的唯一用法是当有另一条语句具有相同的名称另一条节点(...)如果第一个成功,我们不希望被调用。一个例子是一个函数,它接受X和Y,并返回较大的一个作为第三个参数。 max1(X, Y, X) :- X > Y, !.
max1(_X, Y, Y). 但是,没有其他名为node(...)的语句因此,
几天前,我找到了prolog,我一直坚持这个问题。我想递归地减去一个数字,直到这个数字小于0。用伪代码来说,这就像:
N:=0
while(Y>=X)
{
Y := Y-X
N := N+1
Y := Y+2
}
例如,如果我有Y=20和X=10,那么我们就可以得到N=2和Y=4。
有什么想法吗?提前谢谢。任何帮助都很感激。我用的是SWI Prolog。
编辑1到目前为止我已经完成的工作是(尽管我不确定它是否正确):
sufficient(X, Y, M, N, F) :-
F is Y-X,
Y>=X,
plus(M, 1, N)
我是Prolog中的新手,所以基本上这个错误对其他人来说是显而易见的。
我的最后一个问题是关于打瓷砖的算法。
问题
假设我们有一个边长为S的正方形,以及长度为X和宽度为Y的矩形瓷砖的N个副本,程序必须显示将这些副本排列在一个网格中的所有方式,以便使没有两个副本可以互相触摸到。
通过显示,我的意思是它必须显示网格中每个副本左上角的坐标集。
坐标从1开始,而不是0。
算法
Find all (x, y) where 0 > x > S, 0 < y < S such that
(x - 1, y) not in A, (x + 1, y) not in A, (x
刚被介绍到prolog,试图通过一些简单的练习,但我在这一点上有点卡住了。我正在尝试编写一个程序来输出输入列表的所有子列表,其中每个子列表的长度都大于1,并且它不能扩展到更大的子列表。它还将输出子列表中的起始位置。因此,示例输出将为
| ?- plateau([a,a,b,2,2,2,a+1,a+1,s(1,2)], I, Len).
I = 1,
Len = 2 ? ;
I = 4,
Len = 3 ? ;
I = 7,
Len = 2 ? ;
no
我仍然对整个声明式的东西感到非常困惑,并且在从命令式模式切换出来时遇到了很多麻烦。我在
头衔或多或少就说明了一切。我在SWI中获得了以下代码:
get_card(1):-
nb_getval(playerOneHand, Hand),
write("Select which cards you want to play:"), nl,
read(Input),
handle_input(Input).
get_card(2):-
nb_getval(playerTwoHand, Hand),
write("Select which cards you want to play:"), nl,