我试图写一条规则来告诉“ A”何时可能成为“ B”的兄弟,但是我遇到了一个错误,一个警告是第一个错误说:no permission to modify static procedure (\= )/2
而警告说:Singleton variables [A,B]。我知道单例变量意味着该变量只能使用一次,但是我无法找到一种方法来修复代码,但是我不了解第一个错误,因为我是Prolog初学者,因此它可能恰好是我的一个愚蠢错误找不到。
brother(A,B):-
parent(X,A),
parent(X,B),
male(A).
A \= B.
Run Code Online (Sandbox Code Playgroud) 我想用 1 到 N 之间的随机值填充数组“a”(没有重复值)。假设 randInt(i, j) 的 Big-O 为 O(1),并且该函数生成从 i 到 j 的随机值。
输出示例如下:
{1,2,3,4,5} 或 {2,3,1,4,5} 或 {5,4,2,1,3} 但不是 {1,2,1,3,4}
#include<set>
using std::set;
set<int> S;// space O(N) ?
int a[N]; // space O(N)
int i = 0; // space O(1)
do {
int val = randInt(1,N); //space O(1), time O(1) variable val is created many times ?
if (S.find(val) != S.end()) { //time O(log N)?
a[i] = val; // time O(1)
i++; // time O(1)
S.insert(val); // …Run Code Online (Sandbox Code Playgroud) 我不明白为什么这个乘法的递归定义有效。
我得到了添加部分,但是在这种情况下“A”的值如何。代码如下:
add(0,X,X).
add(s(X),Y,Z):-add(X,s(Y),Z).
mult(0,X,0).
mult(s(X),Y,Z):-mult(X,Y,A), add(Y,A,Z).
Run Code Online (Sandbox Code Playgroud) 如何计算Prolog中两个分数的总和.让命名函数fracsum(X,Y,Z)与x+y=z(x和y的级分,即得Z也如分数).
一些例子:fracsum(1/9,1/9,Z)结果Z=2/9或fracsum(5/9,1/9,Z)结果Z=2/3(也得到最低的分数,而不是6/9得到2/3).
因为我是Prolog的初学者,所以任何帮助都会有用.
我有一个类Movie,其中有像 2515159 这样的代表电影的实例,还有一个名为 的类Country,其中有像英国、美国、意大利、奥地利和其他国家这样的实例。我还有一个hasCountry与电影中的国家相匹配的角色,例如:
2515159 hasCountry Italy
2515159 hasCountry Austria
Run Code Online (Sandbox Code Playgroud)
(一部电影可以有多个国家)
现在的问题是:
我想创建一个MovienameEuropeanMovie,其中包含仅拥有欧洲国家的个人的实例。
在 protege 创建名为 EuropeanMovie 的 Movie 子类后,我尝试将“等效项”放置为:
Movie and hasCountry only {Austria,Italy, ...all the EU countries...}
Run Code Online (Sandbox Code Playgroud)
还尝试过:
Movie
and hasCountry some (
{Austria,Italy, ...all the EU countries...}
and not {USA, and other non EU countries...} )
Run Code Online (Sandbox Code Playgroud)
但是,上面仅使用关键字不会返回任何内容,而有仅包含欧盟国家的电影(如开头的示例)。
经过大量搜索后,我没有找到太多,但我认为这可能与猫头鹰的开放世界假设有关,但我不明白这一点。
如果有人能给任何建议,那将非常有帮助,谢谢!
关于冒泡排序时间复杂度还有其他问题,但这个问题不同。大家都说冒泡排序最坏情况是 O(n^2)。在列表 i 次迭代之后的冒泡排序中,列表的最后 i 个元素是有序的,不需要再次触摸或比较。如果你不必要地一次又一次地运行最终元素,时间复杂度只会是 O(n^2)。
鉴于冒泡排序的一个主要特征是(输入大小减去迭代)之后的元素永远不需要再次比较,因为它位于正确的位置,为什么冒泡排序的时间复杂度对我来说是这样的没想到是冒泡排序?即使在维基百科中,它也说时间复杂度是 O(n^2),然后在文章的中间才提到,通过不不必要地比较最后 i 个元素,可以“优化”到只花费大约 50% 的时间。
我想起了这一点,因为我正在制作一个循环来检查世界上所有对象的碰撞,并且我检查的模式是:
for (int i = 0; i < numberofobjects - 1; i++)
{
{
for (int iplusone = i + 1; iplusone < numberofobjects; iplusone++)
// check collision between i and iplusone
}
}
Run Code Online (Sandbox Code Playgroud)
对于 400 个对象,时间复杂度为 O(n^2) 400 * 400 = 160,000。然而它只进行了 79,800 次比较,大约是 50%,这正是维基百科所说的。这让我想起了冒泡排序,所以当我检查时,我惊讶地发现每个人都说它是 O(n^2)。
这是否意味着每当有人提到冒泡排序时,他们指的是不必要地重复已排序的最终元素的版本?此外,当比较不同的算法时,冒泡排序总是表现更差,但作者是否指的是明显糟糕的 n^2 版本?
我如何n*n在Prolog中获得一个大小矩阵的对角线列表?
预期行为:
?- diagonal1([[1,3,2],[4,5,7],[6,8,9]],D1).
D1=[1,5,9]
?- diagonal2([[1,3,2],[4,5,7],[6,8,9]],D2).
D2=[2,5,6].
Run Code Online (Sandbox Code Playgroud)
(我使用内置函数很好.)
用于打印char的十进制值的程序:
#include<stdio.h>
int main(void){
char ch = 'AB';
printf("ch is %d\n",ch);
}
Run Code Online (Sandbox Code Playgroud)
为什么打印第二个字符的十进制值,为什么不是第一个字符的十进制值?
输出: ch is 66
我想基于列表的第二个值按降序对元组列表进行排序,而不使用内置的排序谓词.
示例:(Name, Age).
unsorted_list = [(mary, 20), (jack, 50), (bob, 16), (bill, 20) ].
sorted_list = [(jack, 50), (bill, 20), (mary, 20), (bob, 16)].
Run Code Online (Sandbox Code Playgroud)
有谁知道这样做的优雅方式?
我想在Prolog中创建一系列数字.因此,如果功能是print(4,3,10),它将打印4 7 10 13 16 19 22 25 28 31.第二个参数确定下一个数字,最后一个参数确定序列应停止的位置.
我有代码,但它似乎不起作用.
print(A,B,C) :- C>=0.
print(A,B,C) :- D is A+B, E is C-1, print(D,B,E), write(D).
结果只显示true.
这个问题有什么解决方案吗?谢谢.
我需要四个命令提示符命令才能在一个批处理文件中运行.它应该从上到下运行.命令是:
ipconfig /flushdns
ipconfig /release
ipconfig /renew
exit
Run Code Online (Sandbox Code Playgroud)