我有一个序言谓词,该谓词接受两个参数(在这里都标记为X
,因为它们应该是相同的),并对其进行比较以查看它们是否得出相同的原子。这就是意图。但是,当两个参数都是变量时,谓词意外返回false。
我正在尝试在Prolog中定义句子逻辑/命题演算中的表达式为“蕴涵范式”的表达式的概念。此处的隐含范式表示所有连接词都被->
和falsum
取代。
作为一个基本案例,我想说一个完全由原子组成的表达式本身已经具有正常形式。
这就是我试图表达的方式。我要重复一个参数名称,而不是对参数之间的某种相同性进行检查。
% foo.P
implication_normal(X, X) :- atom(X).
此不完整但仍然有用的定义旨在捕获implication_normal(x, x)
为真,而implication_normal(x, y)
为假的事实。
在某些方面似乎可行:
$ swipl -s foo.P
?- implication_normal(x, x).
true.
?- implication_normal(x, y).
false.
?- implication_normal(1, 1).
false.
它用变量做错了事(应该枚举成对的“绑定上下文”,其中X
和Z
恰好指向同一原子)。
?- implication_normal(X, Z).
false.
如果您给它两次相同的变量,它也会返回false。
?- implication_normal(X, X).
false.
出于某些奇怪的原因,如果给它一个变量和一个原子(则失败,则使用整数)会导致行为正确。
?- implication_normal(X, z).
X = z.
?- implication_normal(X, 1).
false.
,如果变量为第二,则类似。
?- implication_normal(z, X).
X = z.
?- implication_normal(1, X).
false.
如何更改implication_normal
的定义,以便在提供变量的所有情况下都能枚举?
答案 0 :(得分:2)
标准func storeUserData() {
let appDelegate = UIApplication.shared.delegate as! AppDelegate;
let context = appDelegate.persistentContainer.viewContext
//store data
let newUser = Users(context: context);
newUser.name = self.name.text;
newUser.loginUsername = self.loginUsername.text;
newUser.loginPassword = self.loginPassword.text;
appDelegate.saveContext();
//retrieve data
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users");
request.returnsObjectsAsFaults = false
do {
print("Fetching from DB")
let result = try context.fetch(request)
//printing data
for data in result as! [NSManagedObject] {
print(data.value(forKey: "name") as! String)
print(data.value(forKey: "loginUsername") as! String)
print(data.value(forKey: "loginPassword") as! String)
}
} catch {
print("Failed to fetch")
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
谓词是类型检查谓词。它没有枚举原子。它只是确定性地检查其参数是否为原子。此外,您对atom/1
谓词的定义试图统一两个参数,如果统一成功,则调用implication_normal /2
及其结果项。这就是诸如atom/1
之类的呼叫成功的原因:implication_normal(X, z)
与X
统一,而z
为真。
请注意,某些Prolog系统提供了确实枚举原子的atom(z)
。在这些系统上,您可以改写:
current_atom/1
使用SWI-Prolog进行一些示例调用:
implication_normal(X, X) :- current_atom(X).