prolog 订阅
Prolog(Programming in logic)是一种面向演绎推理的逻辑型程序设计语言,最早于1972年由柯尔麦伦纳(Colmeraner)及其研究小组在法国马赛大学提出。 [1]  高济,何钦铭著,人工智能基础 (第二版),高等教育出版社,2008.10,第67页 展开全文
Prolog(Programming in logic)是一种面向演绎推理的逻辑型程序设计语言,最早于1972年由柯尔麦伦纳(Colmeraner)及其研究小组在法国马赛大学提出。 [1]  高济,何钦铭著,人工智能基础 (第二版),高等教育出版社,2008.10,第67页
信息
提出者
柯尔麦伦纳及其研究小组
简    称
Prolog
定    义
面向演绎推理的逻辑型语言
应用学科
计算机原理
中文名
逻辑编程语言
外文名
Programming in logic
提出时间
1972年
逻辑编程语言关于逻辑编程语言
Prolog以处理一阶谓词演算为背景,由于其简单的文法、丰富的表达力和独特的非过程语言的特点,很适合用来表示人类的思维和推理规则,从而一问世就赢得了人工智能研究和应用开发者的广泛兴趣。尤其在西欧和日本,Prolog语言已推广应用于许多应用领域,如关系数据库、数理逻辑、抽象问题求解、自然语言理解和专家系统等。日本还在其于1979年提出的第五代计算机研究计划中把Prolog列为核心语言。Prolog实际上就是一种基于逆向规则的演绎推理技术,只不过对规则和目标的表示有严格的限制.再加上演绎推理控制机制自身的简单性,难以适用于复杂的应用域。 [1] 
收起全文
精华内容
参与话题
问答
  • prolog

    2008-08-20 16:57:49
    prolog教程 智能控制技术
  • Prolog

    2017-12-11 20:03:38
    PrologChap1 Basic ConstructGoal/Fact/Query Goal: 就像plus(0,0,0)这样的,注意后面没有?也没有. Fact: plus(0,0,0). Query: plus(0,0,0)? A fact P. states that the goal... asks if the goal P is true.回答一个q

    Prolog

    Chap1 Basic Construct

    Goal/Fact/Query

    • Goal: 就像plus(0,0,0)这样的,注意后面没有?也没有.
    • Fact: plus(0,0,0).
    • Query: plus(0,0,0)?

    A fact P. states that the goal P is true.

    A query P? asks if the goal P is true.

    回答一个query的过程,就是判断这个query是不是program的logical sequence. 如何判断呢?就是对最原始的program运用推导规则,最简单的推导规则是identical.

    logical variable/substitution/instance

    • logical variable: father(abraham, X)?中的X就是逻辑变量。这句话就是在问是否存在一个X的值使得father(abraham,X)成为program的logical sequence.
    • term:
      1. constant和variable是term;
      2. compound term(或者叫structure)也是term,形如f(t1,t2,…tn);
      3. 一个compound term由一个functor和若干个参数(也是term)组成,functor就是上面的f,ti就是参数;
      4. functor是一个atom
    • ground: 没有变量的term,如foo(a,b)
    • nonground: 含逻辑变量的term,如foo(X)

    所以term是可以嵌套的,递归的,下面是一些例子:
    s(0), name(john,doe), list(a,list(b,nil)).
    逻辑变量与其他语言中变量的区别:代表不确定但单一的实体,但是其他语言中代表内存位置

    Definition
    A substitution is finite set(possibly empty) of pairs of the form Xi=ti, where Xi is a variable and ti is a term, and XiXj if ij, and for any i and j, Xi doesn’t occur in tj.

    example: {X=isaac}.
    substitution可以被应用到term上,替换θ被应用到term A上,表示为Aθ.

    Definition
    A是B的实例,如果存在一个substitution θ使得A=Bθ.

    新的推导规则:generalization:一个query P是它的instance的logical consequence. 为什么?因为P的实例肯定可以写为Pθ, 那既然P可以将一些变量代换掉就形成Pθ,只要Pθ为true,那么肯定存在Xi的值使得P为true.

    实际上,回答一个含变量的query就是搜索一个是该query的实例的fact。

    每条语句以. 结尾,而不是分号。
    =不是赋值!赋值貌似是is

    Basic Constructs

    Facts/Predicate

    个人理解就是基本的事实/断言(fact/predicate),描述一个database,Prolog里面会使用facts和rules来描述。rules负责推导,facts是基本的事实。

    example: father(abraham, isaac)

    表示一个基本事实:abraham是isaac的爸爸。

    Query

    query就是从数据库中提取信息的语句。

    example:father(abraham,isaac) 就是在问abraham是不是isaac的爸爸?就是参数之间是否有father这层关系?

    看起来query和fact形式一样,但是根据上下文,语义是不一样的。

    When there is a possibility of confusion, a terminating period indicates a fact, a terminating question mark indicates a query.当存在混淆的可能性时,若是以句号结尾,则是fact,若是问好结尾,则是query。

    回答一个query,就是判断是否这个query是这个program的一个logical consequence。logical consequence如何得到?通过应用推导规则。最简单的推导规则就是identity: P deduce P

    Goal

    没有句号或者问号的实体,就是把fact的句号去掉,query的问号去掉得到的实体。

    example:

    P. is a fact, then P is a goal and this fact says that the goal P is true.

    P? is a query, then P is a goal and this query is asking whether the goal P is true.

    A simple query consists of a single goal.

    如何定义一个relation?

    facts,rules

    //facts
    direct_flight(hongkong, tokyo).
    direct_flight(hongkong, beijing).
    direct_flight(hongkong, sanfrancisco).
    direct_flight(tokyo, hongkong).
    direct_flight(tokyo, vancouver).
    
    //rules
    flight(X,Y) :- direct_flight(X,Y).
    flight(X,Z) :- direct_flight(X,Y), flight(Y,Z).

    语法:

    clause -> facts | rules
    fact -> functor(terms).
    rule -> compound term :- compound term, ... , compound term
    term -> simple term | compound term
    
    compound term -> functor(term,term,term...)
    simple term -> number | atom | variable
    
    atom -> Alphanumerics | Special character strings | Quoted character strings
    variable -> strings of letters, digits and '_' and start with an upper case letter | "_"(Anonymous variable)

    List

    []
    [6,*,[9],is]//注意这里可以是不同的类型
    [1,2]

    | 运算符

    [V1, V2, V3, … Vn | Tail] = [V1, V2, V3, … Vn, all the items in Tail], | 运算符前面是一系列元素,后面Tail是一个list。

    cons

    根据list的第一个元素,i.e. head和list的尾部, i.e. tail: 合并成一个整的list:

    cons(X, Y, Z) :- Z=[X | Y].
    
    cons(X, Y, [X | Y]).

    member

    判断X是否是Y的元素

    member(X, Y) :- Y=[X | Z].
    member(X, [Y1 | Z]) :- member(X, Z). 

    append

    append操作两个list,将第2个list的所有元素贴到list1后面去

    append([], L1, L1).
    append([X| L1], L2, [X | L3]) :- append(L1, L2, L3).

    split

    input: pivot,list

    output: Left, Right

    所以relation括号内是个4元祖

    split(X, [], [], []).
    split(X, [Y1 | T], [Y1|L2], L3) :- Y1 <= X, split(X, T, L2, L3).
    split(X, [Y1 | T], L2, [Y1|L3]) :- Y1 > X, split(X, T, L2, L3).

    qSort

    qSort(X, Y)判断是否Y是将X排序好的结果

    Substitutions and Unification

    替换

    {v1/t1, v2/t2, ..., vn/tn}//其中vi是variable,ti是term

    将一个替换可以应用于一个term,像下面这样

    mother(X,a){X/b, Y/c} = mother(b,a)
    mother(X,a){Y/b, Z/c} = mother(X,a)
    append([],Y,Y){Y/[a,b,c]} =
    append([],[a,b,c],[a,b,c])
    mother(X,Y){X/Y,Y/X} = mother(Y,X)

    A term u is an instance of t, if u = tσ. 即如果t应用了一个替换后得到u,则u是t的一个实例。

    Unify

    t1 and t2 unify if t1σ = t2σ for some substitution σ, this σ is called a unifier.

    mother(X,a) and mother(b,a) unify: {X/b}
    cons(X,Y,[X | Y]) and cons(a, [b,c], [a,b,c]]) unify
    f(X) and f(Y) unify: {X/Y}, {Y/X}, {X/a, Y/a},
    {X/f(a),Y/f(a)}, {X/g(Z), Y/g(Z)}, ...

    可以看到,如果两个term, t1 and t2 unify, 他们可能有很多unifiers。我们定义一个Most General Unifier(MGU):

    A unifier σ of t1 and t2 is called a most general unifier (mgu) if for all other unifier σ0, t1σ0 is an instance of t1σ. (This means that t2σ0 is an instance of t1σ as well.

    Example:

    Let σ be {X/Y}, σ0={X/a,Y/a}, t1=f(X), t2=f(Y),

    f(X)和f(Y): {X/Y}是1个MGU。

    t1σ=f(Y), t2σ=f(Y)

    t1σ0=f(a), t2σ0=f(a)

    发现: t1σ0t1σ的instance,所以σ不可能是MGU。

    MGU也仍然不是唯一的,但是所有的MGU其实是等价的。

    Exercise

    1. 求f(h(X,a),b) and f(h(g(a,b),Y),b) 的mgu.

      h(X,a)=h(g(a,b),Y) => X=g(a,b), a=Y => σ={X/g(a,b), Y/a}.

    2. 求f(W,g(Z),Z) and f(X,Y,h(X))的mgu

      W=X, g(Z)=Y, Z=h(X)? 所以mgu是{W/X, Y/g(Z), Z/h(X)}?

      t1=f(X,g(h(X)),h(X)), t2=f(X,g(Z),h(X)这就不一样了!

      不过这为什么呢?是不是因为Y替换成g(Z),而Z也被替换了,所以Y需要进一步替换!?

      不对!可以在终端输入f(W,g(Z),Z) = f(X,Y,h(X)). 终端计算结果为:

      W = X, Z = h(X), Y = g(h(X)).

    展开全文
  • ProLog

    2006-10-10 15:28:46
    完整的prolog程序是有事实和规则组成的。 事实用来储存一些数据,而规则用来储存某种可以推理出来的关系。 理论上来说使用c语言可以编制任何种类的程序,甚至连prolog语言都是使用c语言编写的。不过对于急于...
    http://www.chinaai.org/Article_Show.asp?ArticleID=314

    完整的prolog程序是有事实和规则组成的。

    事实用来储存一些数据,而规则用来储存某种可以推理出来的关系。

    理论上来说使用c语言可以编制任何种类的程序,甚至连prolog语言都是使用c语言编写的。不过对于急于开发应用程序的用户,最关心的是如何最经济最有效率的开发程序,prolog为你多提供了一个选择的余地。

    在prolog程序中,是很难分清楚哪些是程序,哪些是数据的。事实上,prolog中的所有东西都有相同的形式,也就是说数据就是程序,程序就是数据。

    prolog的原理就是关系数据库,它是建立在关系数据库的基础上的。在以后的学习中你会发现它和SQL数据库查询语言有很多相似之处。使用prolog可以很方便的处理数据。

    http://groups.google.co.id/group/nirvanastudio/browse_thread/thread/dd5ad220e3c086a6/137508f386298e1e?lnk=raot&hl=id
    函数Currying的意思就是将参数和函数关联起来,变成一个新的函数。比如一个二元参数f a b
    当给出f 1的时候,应该返回什么呢?一般的语言中,要么是将b设为一个默认值,要么就是直接出错,而当有了Currying,那么f
    1其实返回一个函数g x = f 1 x。

    在理论计算机科学中,Curry化提供了在简单的理论模型中比如只接受一个单一参数的lambda 演算中研究带有多个参数的函数的方式。

    Lambda 演算可以被称为最小的通用程序设计语言。它包括一条变换规则 (变量替换) 和一条函数定义方式,Lambda 演算之通用在于,任何一个可计算函数都能用这种形式来表达和求值。因而,它是等价于图灵机的。尽管如此,Lambda 演算强调的是变换规则的运用,而非实现它们的具体机器。可以认为这是一种更接近软件而非硬件的方式。
    展开全文
  • m getting the following compilation errors when trying to <code>cargo install scryer-prolog</code> today (May 16). <p>Can post system details if needed. <pre><code> Updating crates.io index ...
  • Question about prolog

    2020-11-20 19:39:28
    <div><p>The tree of the project looks like this: <pre><code> $ tree -L 3 -F . ├── build.rs ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ...mthom/scryer-prolog</p></div>
  • prolog编译器

    2013-02-27 20:47:29
    prolog编译器,适合初学者使用。Prolog语言最早由Aix-Marseille大学的Alain Colmerauer与Phillipe Roussel等人于60年代末研究开发。1972年被公认为是Prolog语言正式诞生的年份,自1972年以后,分支出多种Prolog的...
  • prolog安装程序

    2010-10-05 18:27:44
    Prolog(Programming in Logic的缩写)是一种逻辑编程语言。它建立在逻辑学的理论基础之上, 最初被运用于自然语言等研究领域。现在它已广泛的应用在人工智能的研究中,它可以用来建造专家系统、自然语言理解、智能...
  • Prolog bear

    2020-12-01 15:38:16
    <div><p>Im not entirely sure but i think we should have a prolog bear, and i found this: https://github.com/wysiib/linter-prolog</p> <p>looks quite easy, but it requires apm (atom package manager), it...
  • The dot in Prolog

    2020-11-20 19:46:01
    <div><p>The following happens: <pre><code> ?- current_op(Pri, Fix, '.'). false. ?- true.true . caught: error(syntax_error(incomplete_reduction),read_term/3:1) ...mthom/scryer-prolog</p></div>
  • Unexpected EOF in prolog

    2015-09-21 01:54:31
    Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog at [row,col {unknown-source}]: [1,0] at com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:661) at ...
  • 这些讲义介绍了声明性编程语言Prolog。 重点是学习如何编程,而不是逻辑编程理论。 尽管如此,也包括一小段关于Prolog逻辑基础的内容。
  • 前几天才开始学prolog的东西,遇到的一个关于二叉树的prolog问题就不会写了,想请教一下大家。 譬如说这里有一个二叉树,facts我就不一一列举了,主要有两种 一个是 leftchild(X,Y) 另一个是 right(X,Y) 下面有几...
  • 编程语言Prolog的简介。 假设以前没有编程知识。
  • prolog入门

    2013-06-17 12:08:10
    很好的prolog入门教程,可以很快的学习prolog
  • Prolog不会进行XML解析

    2019-03-28 02:05:14
    <p>Recently I starting using Go. I am facing one problem while parsing XML.... <p>Here is the issue: <p>I am successfully able to parse the ...<p>Not sure what is the issue here with Prolog. </div>

空空如也

1 2 3 4 5 ... 20
收藏数 1,686
精华内容 674
关键字:

prolog