wordpress主题flarum,系统优化,在建设厅网站上查询注销建造师,个人开发什么软件挣钱//love(zhangxueyou,wanfei). 爱(张学友,王菲). “张学友爱王菲”。prolog是不允许使用除了基本字符以外字符的。最末尾的“.”一定不能掉#xff0c;它表示一个句子结束。 //“:-”在prolog中表示“如果”的意思#xff0c;我们使用它来定义规则。lovers(X,Y):-love(X,Y),lo…//love(zhangxueyou,wanfei). 爱(张学友,王菲). “张学友爱王菲”。prolog是不允许使用除了基本字符以外字符的。最末尾的“.”一定不能掉它表示一个句子结束。 //“:-”在prolog中表示“如果”的意思我们使用它来定义规则。lovers(X,Y):-love(X,Y),love(Y,X).某人甲和某人乙是情侣的规则就是某人甲爱某人乙并且某人乙爱某人甲。上面用来分隔两个爱的句子的“”表示并且的意思。 //提示符号为“?-”询问返回yes/no。?-love(zhangxueyou,wanfei).张学友爱王菲么解释器将回答yes。 //“;”是人工输入的当解释器找到一个答案之后它将这个答案输出并且等待用户的进一步输入如果用户输入“;”解释器将继续寻找其他的答案如果输入的是别的符号解释器将终止查询。 //事实facts是prolog中最简单的谓词predicate。它和关系数据库中的记录十分相似。 //谓词 Prolog语言的基本组成元素可以是一段程序、一个数据类型或者是一种关系。它由谓词名和参数组成。两个名称相同而参数的数目不同的谓词是不同的谓词。 //事实的语法结构如下pred(arg1, arg2, ... argN). 其中pred为谓词的名称。arg1...为参数共有N个。‘.’是所有的Prolog子句的结束符。没有参数的谓词形式如下 pred. 参数可以是以下四种之一 整数integer) 绝对值小于某一个数的正数或负数。 原子atom 由小写字母开头的字符串通常是字母和数字组成开头的字符必须是小写字母。使用单引号扩起来也是。 变量variable 由大写字母或下划线_开头。变量‘_’是匿名变量。结构structure结构由结构名和一定数量的参数组成与目标和事实是一样的。 //Prolog的目标有四个端口用来控制运行的流程调用call、退出exit、重试redo以及失败fail。一开始使用Call端口进入目标如果匹配成功就到了exit端口如果失败就到了fail端口如果用户输入分号则又从redo端口进入目标。call 开始使用目标搜寻子句。 exit 目标匹配成功在成功的子句上作记号并绑定变量。 redo 试图重新满足目标首先释放变量并从上次的记号开始搜索。 fail 表示再找不到更多的满足目标的子句了。 //在Prolog的解释器中输入?- debug.就可以开始调试你的程序了。 //常用的输出谓词。 write/1 此谓词被调用时永远是成功的并且它可以把它的参数作为字符串输出到屏幕上。当回溯时它永远是失败所以回溯是不会把已经写到屏幕上的字符又给删除的。 nl/0 此谓词没有参数和write一样从Call端口调用时总是成功的从Redo端口回溯时总是失败的它的作用是在屏幕上输出一个回车符。 tab/1 此谓词的参数是一个整数它的作用是输出n个空格n为它的参数。其控制流程与上面两个相同。 //fail/0 专门引起回溯的内部谓词从它的名字不难看出它的调用永远是失败的。如果fail/0从左边得到控制权则它立即把控制权再传回到左边。它不会从右边得到控制因为没法通过fail/0把控制权传到右侧。 //输出列表结尾不显示no。下面我们来编写list_connections/1它能够列出与某个房间相连的所有房间。list_connections(Place) :- connect(Place, X), tab(2), write(X), nl, fail.list_connections(_). //算术X is 数学表达式 变量X将被赋值为表达式的值在回溯时不赋值。X Y X Y //asserta(X) 把子句X当作此子句的谓词的第一个子句加入到动态数据库中。它和I/O内部谓词的流程控制相同。回溯是失败并且不会取消它所完成的工作。 //retract(X) 把子句X从动态数据库中删除。此操作也是永久性的也就是说回溯的时候不能撤销此操作。 //not/1内部谓词它的参数是一个目标如果此目标失败则它成功目标成功则它失败。 //联合变量任何项目: 变量可以与任何项目绑定其中也包括变量 原始项目原始项目: 两个原始项目原子或整数只有当它们相同时才能联合。 结构结构: 如果两个结构的每个相应的参数能联合那么这两个结构可以联合。 ‘/2’内部谓词此谓词当它的两个参数能够联合时成功反之则失败。它的语法如下(arg1, arg2)为了方便阅读也可以写成如下形式arg1 arg2 注意此处的等号在Prolog中的意义与其他语言中的不同。它不是数学运算符或者赋值符。 如果在两次绑定中变量的值发生冲突那么目标就失败了。 如果变量不能绑定为某一可能的值那么联合也将失败。 匿名变量_不会绑定为任何值。所以不要求它所出现的位置的值必须相同。 //列表列表是一组项目的集合此项目可以是Prolog的任何数据类型包括结构和列表。列表的元素由方括号括起来项目中间使用逗号分割。我们可以使用列表来代替以前的多个子句。例如 loc_list([apple, broccoli, crackers], kitchen). 当某个列表中没有项目时我们称之为空表使用“[]”表示。也可以使用nil来表示。下面的句子表示hall中没有东西。 loc_list([], hall) //op/3来定义操作符它的三个参数分别是优先权、结合性、操作符名称。每个操作符有不同的优先权值从1到1200。当某句中有多个操作符时优先权高的将先被考虑。优先权值越小优先权越高。 结合性使用模板来定义例如中缀操作符使用“xfx”来定义。“f”表示操作符的位置。当操作符的优先权相同时Prolog必须决定是从左到右还是从右到左地读入操作符。这就是操作符的左右结合性。有些操作符没有结合性如果你把两个这种操作符放到一起将产生错误。 Infix: xfx non-associative 没有结合性 xfy right to left yfx left to right Prefix fx non-associative fy left to right Postfix: xf non-associative yf right to left 为了表示这种嵌套关系我们可以使用从右到左的结合性。 ?- op(35,xfy,is_in). //display/1可以看到操作符等的标准的语法结构。 //只有一些特殊的内部谓词例如is/2进行真正的数学运算。is/2计算它右边表达式的值并让左边绑定为此值。它与联合谓词是不同的只进行联合而不进行计算。