什么决定谓词的运行顺序?



我正在使用一些代码,其中一部分是由我的教授编写的,它将表格作为输入,展开它,然后输出完整的表格。

我很难理解谓词运行顺序背后的逻辑。是什么决定因素,比如说,使程序在否定之前处理连接,如果两者都存在于原始公式中?递归是如何起作用的呢?

代码如下:

%negation
expand([[not(not(X))|B]|T], T1) :-
expand([[X|B]|T], T1).
%conjunction
expand([[(X)+(Y)|B]|T], T1):-
expand([[X, Y|B]|T], T1).
expand([[not((X)+(Y))|B]|T], T1):-
expand([[not(X)|B], [not(Y)|B]|T], T1).
%disjunction
expand([[(X)/(Y)|B]|T], T1):-
expand([[X|B], [Y|B]|T], T1).
expand([[not((X)/(Y))|B]|T], T1):-
expand([[not(X), not(Y)|B]|T], T1).
%not sure what the rest is or how it works
expand([[X|B]|T1], T5) :-
expand([B], T2), distribute(X,T2,T3), expand(T1,T4), append(T3,T4,T5).
expand([[]|T1], [[]|T2]) :-
expand(T1, T2).
expand([],[]).
distribute(X,[B|T],[[X|B]|T1]) :-
distribute(X,T,T1).
distribute(_,[],[]).

为这篇模糊的文章道歉,我不熟悉这门语言

Prolog程序包括

  • 事实,一个简单的事实陈述。像这样

    mother( jane , alice ) .
    mother( jane , john  ) .
    

    是两个事实表明Jane是Alice和John的母亲。

  • 谓词,更复杂的真理断言。像这样:

    sibling(X,Y) :- same_mother(X,Y), same_father(X,Y) .
    half_sibling(X,Y) :-    same_mother(X,Y) , + same_father(X,Y) .
    half_sibling(X,Y) :- + same_mother(X,Y) ,    same_father(X,Y) .
    same_mother(X,Y) :- mother(M,X), mother(M,Y) .
    same_father(X,Y) :- father(F,X), father(F,Y) .
    

    ,

    • 两个人,X和Y,如果他们有相同的母亲和父亲,则是兄弟姐妹,并且
    • 两个人,X和Y,如果他们有任何一个,就是同父异母的兄弟姐妹
      • 同母异父,或
      • 异母同父

每个谓词都是一个逻辑命题,写成谓词演算的限制形式,并形成一个搜索树(实际上更像是一个搜索)。当您查询/执行谓词时,输入

sibling(stephen,alice).

Prolog的推理引擎基本上遍历搜索树,直到成功失败。如果它成功了,可以回溯到它,它将继续遍历,直到再次成功或失败。

所以,谓词的执行顺序是完全依赖于开始求值的谓词及其结构。

请注意,根据实例化或未实例化的实参/形参,当对谓词进行求值时,允许提出带有多个答案的问题:

  • sibling( john, X ).问"谁是John的兄弟姐妹?";
  • sibling( X , Y ).问了一个问题"谁是所有的兄弟姐妹?";

开始学习Prolog的一个很好的文本是

  • Clocksin+Mellish'sProgramming in Prolog-这是一个很好的语言介绍。

  • Clocksin的子句和效果-我听说这是初学者的文章,但我没有读过。

一旦你得到了基本的…

  • 斯特林+夏皮罗的序言的艺术是一本最优秀的书,带你深入

而O'Keefe的The Craft of Prolog则是一个更深入的探索。

最新更新