Prolog ...定义谓词,以检查两个参数是否/都指向同一原子

时间:2018-09-25 00:27:37

标签: prolog

我有一个序言谓词,该谓词接受两个参数(在这里都标记为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.

它用变量做错了事(应该枚举成对的“绑定上下文”,其中XZ恰好指向同一原子)。

?- 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的定义,以便在提供变量的所有情况下都能枚举?

1 个答案:

答案 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).