我刚刚在大学开始学习 Prolog,我有一个概念问题,我没有找到任何具体的答案:
我想内化这种语言的“哲学”,所以我想非常准确地理解复杂术语(或复合术语)是什么。到目前为止,我已经读到复杂的术语是函子并且它是元数。我可以使用这样的复杂术语构建知识库:
love(john, sarah).
Run Code Online (Sandbox Code Playgroud)
假设现在我可以输入任何可能的字符串对作为“love”的参数,除非该字符串对是“john,sarah”,否则它将为假。是的,所以函子及其参数的“问题”是对还是错,取决于我是否在我的知识库中明确说过这一点,或者 Prolog 是否可以使用规则、统一等从他拥有的信息中推断出它。
是的,从这里开始,我明白一个复杂的术语表示 n 个实体之间的关系是true 或 false。我不明白的是:
vertical(line(point(X,Y),point(X,Z))).
Run Code Online (Sandbox Code Playgroud)
我明白什么是(X,Y)。做。也就是说,任何实体都通过“点”与任何其他实体相关。我不明白的是点(X,Y)如何可以作为线的参数!到目前为止,一个复杂的术语只是表示实体是否相关。我可以理解这是一个“传统函数”,如果实体相关则返回 true 或 false。但这怎么能成为 line 的论证呢?理论上,“line”有 2 个参数(实体),它会说明它们是否相关。现在,参数的值是 true 还是 false?
我可以理解“点(X,Y)”正在创建一个对象“点”。所以线的参数是一个“点实体”。但这不是我到目前为止所读到的有关复杂术语的内容,所以我希望有一个技术定义来解释嵌套的情况。
(如果我使用了错误的术语或定义,我很抱歉,我是 Prolog 新手)
谢谢!
我试图获取一个视频帧,所以我使用MediaMetadataRetriever.getFrameAtTime(),如下所示:
Uri directorio = Uri.parse("android.resource://com.extremeye/" + R.raw.video);
media = new MediaMetadataRetriever();
media.setDataSource(this, directorio);
frame = (ImageView)findViewById(R.id.frame);
Bitmap bmFrame = media.getFrameAtTime();
frame.setImageBitmap(bmFrame);
Run Code Online (Sandbox Code Playgroud)
但问题是我得到:
MediaMetadataRetriever getFrameAtTime:videoframe是一个空指针
在logCat中.
我确定该视频与Android操作系统兼容并且MediaMetadataRetriever加载它,因为我可以在2.3.3操作系统版本中获得其元数据描述而没有问题.
我不知道为什么我不能得到框架,但如果我使用4.2操作系统版本,它的工作完美.我试图改变编解码器和视频的格式,但它不起作用......我想这是格式兼容性的问题,但我不知道我能做什么...
谢谢!!
我有这个例子:
descend(X,Y) :- child(X,Y).
descend(X,Y) :- child(X,Z), descend(Z,Y).
child(anne,bridget).
child(bridget,caroline).
child(caroline,donna).
Run Code Online (Sandbox Code Playgroud)
它工作得很好,我理解它.这是一个小练习的解决方案.我的解决方案是一样的,但改变了:
下降(X,Y): - 下降(X,Z),下降(Z,Y).
也就是说,改变child
为descend
第二descend
规则.
如果我descend(X, Y).
在第一个解决方案中查询,我获得:
?- descend(X, Y).
X = anne,
Y = bridget ;
X = bridget,
Y = caroline ;
X = caroline,
Y = donna ;
X = anne,
Y = caroline ;
X = anne,
Y = donna ;
X = bridget,
Y = donna ;
false.
Run Code Online (Sandbox Code Playgroud)
哪个是对的.但如果我用我的解决方案查询相同,我得到:
?- descend(X, Y).
X = anne,
Y …
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现从vector继承的类的比较运算符。
我希望它先比较自己的新属性,然后再使用从vector继承的运算符。这是一个例子:
struct A : vector<int> {
int a;
bool operator==(const A& other) {
return a == other.a && vector::operator==(other);
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
no member named 'operator==' in 'std::__1::vector<int, std::__1::allocator<int> >'
Run Code Online (Sandbox Code Playgroud)
与STL中其他类的结果相同,但如果我从自己的另一个类继承,则效果很好。
这是我正在使用的vector的实现:
inline _LIBCPP_INLINE_VISIBILITY
bool
operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y)
{
const typename vector<_Tp, _Allocator>::size_type __sz = __x.size();
return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
以下是否正确?
"堆中的向量(带
sbrk
或malloc
)从低地址开始,然后变为高地址".
例如:
int *vec = sbrk(5*sizeof(int)):
Run Code Online (Sandbox Code Playgroud)
vec[0]
在地址中0x500
并且vec[1]
在0x504
.
但是在堆栈中,int vec[5]
从高地址到低地址.
例如:
vec[0]
在... 0xFF8
vec[1]
是0xFF4
.这样对吗?
我能否知道如果手机中以编程方式安装了特定的应用程序?我的应用程序会以某种方式或其他方式进行处理.我怎么能得到这些信息?
谢谢!!