当我想阅读逻辑编程时,我总是偶然发现两种"主要"方式来做到这一点:
我现在感兴趣的是:两者之间的主要技术差异是什么?它们在方法和实现方面是非常相似的,还是采用完全不同的逻辑编程方法?他们来自哪些数学分支,理论基础是什么?
我正在网上和印刷上寻找有关Prolog的优秀初学者资料。我不仅对“学习语言”感兴趣,而且对背景和科学信息也很感兴趣。
我一直在阅读许多文章试图理解功能和逻辑编程之间的区别,但到目前为止我能够做出的唯一推论是逻辑编程通过数学表达式定义程序.但是这样的事情与逻辑编程无关.
我真的很感激功能和逻辑编程之间的差异.
我开始学习Prolog并想知道SQL语言的理论差异.
例如:
更常见的一点是什么?有什么显着的差异?
在Prolog中比在Haskell中更好地解决了哪些问题?这两种语言之间的主要区别是什么?
编辑
是否有可以模仿Prolog功能的Haskell库(一种逻辑解算器)?
可能是一个愚蠢的问题,但我无法在任何地方找到任何文档.有没有办法在prolog中执行if,例如,如果变量为0,则执行某些操作(将文本写入终端).甚至不需要else,但我找不到if的任何实现.
另一个人没有在实践中有什么好处呢?我理解他们所做的事情,但他们在实际使用中的局限性和能力是什么?我正在考虑Drools vs一个新的AI项目的java prolog,但对其他建议持开放态度.在复杂的关系数据集或替代方案上进行推理有哪些流行的方法?
如何在一个符合标准的方式写入avs_term_rearranged(AVs, T, AVsR)
与给定的AVs
和T
,使得AVsR
是的置换AVs
作为其变量发生在左到右的顺序与布置在相同的顺序中的元素T
.
AVs
是一个表单元素的列表,A = V
其中A
一个原子指定一个变量名称,'X'
并且V
是一个相应的变量.这些列表由read_term/2,3
read-option variable_names/1
(7.10.3)生成.另外,没有定义元素的精确顺序.
| ?- read_term(T,[variable_names(AVs)]).
A+B+A+_+C.
AVs = ['A'=A,'B'=B,'C'=C]
T = A+B+A+_+C
Run Code Online (Sandbox Code Playgroud)
T
是一个包含所有变量AVs
加上更多的变量的术语.
请注意,在标准符合程序中,不能依赖变量的术语顺序(7.2.1):
7.2.1变量
如果
X
和Y
是不相同的变量,则X
term_precedesY
应依赖于实现,除了在创建排序列表(7.1.6.5,8.10.3.1 j)期间,排序应保持不变.注 - 如果
X
和Y
都是匿名变量,则它们不是相同的术语(见6.1.2 a).
以8.4.3.4为例:
sort([f(U),U,U,f(V),f(U),V],L).
Succeeds, unifying L with [U,V,f(U),f(V)] or
[V,U,f(V),f(U)].
[The solution is implementation …
Run Code Online (Sandbox Code Playgroud) 当我撇了一些序言最近相关的问题,我偶然发现这个答案通过@mat质疑如何在Prolog中表示定向循环图,可直接通往邻居verticies.
到目前为止,我在Prolog中对属性变量的个人经验非常有限.但@mat给出的用例激发了我的兴趣.所以我尝试用它来回答另一个问题,用约束逻辑编程排序列表.
首先,好消息:我第一次使用归因变量就像我想要的那样.
然后,不是那么好的消息:当我通过回答发布时,我意识到在Prolog中有几个API和属性变量的实现.
我觉得我在这里过头了......特别是我想知道以下内容:
很多问号,这里......请分享你的经验/立场?先感谢您!
这是上面提到的答案的代码片段:
init_att_var(X,Z) :-
put_attr(Z,value,X).
get_att_value(Var,Value) :-
get_attr(Var,value,Value).
Run Code Online (Sandbox Code Playgroud)
到目前为止,我"只"使用put_attr/3
和get_attr/3
,但是 - 根据SICStus Prolog文档中的属性变量--- SICStus提供put_attr/2
和get_attr/2
.
因此,即使是非常浅的用例也 需要一些仿真层(一种方式或另一种方式).