使用=。。在Prolog中执行furmulas符号操作的谓词

使用=。。在Prolog中执行furmulas符号操作的谓词,prolog,Prolog,我正在使用SWI Prolog为大学考试学习Prolog,我对如何使用univ=..=..谓词执行公式的符号操作表示怀疑,因为频繁的操作是替换用另一个表达式替换某个子表达式 定义以下关系是非常困难的: 取代基(亚项、术语、亚项1、术语1) 如果Term1rappresent表示所有出现的子项都被子项1取代的术语表达式,则为真 例如,如果我有: 取代基(sin(x),2*(sin(x)),t,F)。 然后:F=2*t*F(t),因为所有sin(x)的出现都被t取代 这就是解决方案(founbd关于

我正在使用SWI Prolog为大学考试学习Prolog,我对如何使用univ=..
=..
谓词执行公式的符号操作表示怀疑,因为频繁的操作是替换用另一个表达式替换某个子表达式

定义以下关系是非常困难的:

取代基(亚项、术语、亚项1、术语1)

如果Term1rappresent表示所有出现的子项都被子项1取代的术语表达式,则为真

例如,如果我有:

取代基(sin(x),2*(sin(x)),t,F)。

然后:F=2*t*F(t),因为所有sin(x)的出现都被t取代

这就是解决方案(founbd关于Bratko的书),但我不太确定我的解释:

% substitute( Subterm, Term, Subterm1, Term1)
% Term1 is Term with all occurrences (by matching)
% of Subterm are replaced by Subterm1.
% Test: ?- substitute( b, f(a,b,c), e, F).
% Test: ?- substitute( b, f(a,X,c), e, F).
% Test: ?- substitute( b, f(a,X,Y), e, F).
% Test: ?- substitute( a+b, f( a, A+B), v, F).
% Test: ?- substitute(b,B,e,F).
% Test: ?- substitute(b,b,e,F).
% Test: ?- substitute(b,a,e,F).

% Logic, there are three cases:
% If Subterm = Term then Term1 = Subterm1
% otherwise if Term is 'atomic' (not a structure)
%   then Term1 = Term (nothing to be substituted)
%   otherwise the substitution is to be carried
%     out on the arguments of Term.

/* Case 1: SubTerm = Term --> SubTerm1 = Term1 */
substitute(Term, Term, Term1, Term1)  :-  !.

% Case 2: Se Term è atomico non c'è niente da sostituire
substitute( _, Term, _, Term)  :- atomic(Term), !.

/* Case 3: 
substitute(Sub, Term, Sub1, Term1)  :-
   Term  =..  [F|Args],                    % Term è composto da: F è il FUNTORE PRINCIPALE ed Args è la lista dei suoi argomenti
   substlist(Sub, Args, Sub1, Args1),      % Sostituisce Sub1 al posto di Sub nella lista degli argomenti Args generando Args1
   Term1  =..  [F|Args1].                  % Term1 è dato dal FUNTORE PRINCIPALE F e dalla nuova lista degli argomenti Args1

/* sublist: sostituisce all'interno della lista degli argomenti: */


substlist(_, [], _, []).


substlist(Sub, [Term|Terms], Sub1, [Term1|Terms1])  :-

    /* L'elemento in testa Term1 corrisponde all'eventuale sostituzione */
    substitute(Sub, Term, Sub1, Term1),

    /* Il problema è già risolto per le sottoliste e Terms1 rappresenta la sottolista Terms in cui tutte le occorrenze di Sub
       sono già state sostituite con Sub1:
    */
        substlist(Sub, Terms, Sub1, Terms1).
第一条规则rappresent表示特定情况,其中子项=项,因此最后的Term1=子项(因为I取代基替换整个项)

第二条规则rappresent表示一种特殊情况,其中项是一个原子so,与值无关​​对于子项和子项1,我不执行任何替换

我认为,到目前为止,它是简单的,我的推理是正确的…接下来是更难的部分,我不太确定

规则:

substitute(Sub, Term, Sub1, Term1)  :-
   Term  =..  [F|Args],                    
   substlist(Sub, Args, Sub1, Args1),      
   Term1  =..  [F|Args1].    
rappresent表示一种通用情况,其中我有一个表达式rappresented,由项表示,其可能的子表达式rappresented由Sub表示,一个新的子表达式Sub1,当出现Sub时,最终应将其替换,而表达式Term1表示当前的术语表达式,其中所有出现的子项都被SubTerm1替换

因此,我可以用这种方式声明性地阅读它:

如果以下事实为真,Term1 rappresent表示所有出现的子项都被子项1取代的术语表达式,这是事实

1) 原始表达式可以分解为一个列表,该列表的头部有其主函子F(在表达式求值中执行的第一个运算符),随后还有一个子列表Args,该子列表表示该函子F的参数(我认为,在某些情况下,Args还可以包含其他函子,在这个计算步骤中,don不是主函子……因此在这种情况下,还有一些子问题需要解决)

2) subslist(Sub,Args,Sub1,Args1)是真的,这意味着Args1表示所有参数都等于Sub-subexpression的Args被Sub1-subexpression替换

3) 最后,新的Term1必须是univ=..谓词对主函子F和新参数列表Args1的结果(我认为=..将主函子F与新参数列表重新组合)

要执行参数列表中的替换,使用将其划分为以下几部分的子列表关系:

基本情况:

substlist(_, [], _, []).
也就是说:如果参数列表中没有任何内容,那么就没有可以替换的内容

一般情况:

substlist(Sub, [Term|Terms], Sub1, [Term1|Terms1])  :-

    /* L'elemento in testa Term1 corrisponde all'eventuale sostituzione */
    substitute(Sub, Term, Sub1, Term1),

    /* Il problema è già risolto per le sottoliste e Terms1 rappresenta la sottolista Terms in cui tutte le occorrenze di Sub
       sono già state sostituite con Sub1:
    */
        substlist(Sub, Terms, Sub1, Terms1).
对我来说,这是更难理解的部分,我用下面的方式来理解,陈述式阅读:

如果以下情况属实,则[Term1 | Terms1]将显示参数列表[Term | Terms],其中所有子项均替换为Sub1

1) 替换(Sub,Term,Sub1,Term1):这意味着Term1(新参数列表的头)确实是Term(旧参数列表的头),其中如果Term==Sub--->Term1==Sub1

2) subslist(Sub,Terms,Sub1,Terms1)表示所有子问题都已解决,我认为这一点很重要,因为参数列表是当前主函子F的参数列表,但可以包含其他子函子,并且每个子函子都存在一个子问题,在这一步中执行sub-->Sub1替换之前必须解决该子问题

但我不太确定最后一件事

有人能帮我深入理解它

Tnx


安德里亚

首先让我说,如果你能让问题简短、中肯,那就太好了。Stackoverflow的整体理念是,问题和答案在以后对其他人有用,而编写好的问题是其中的一个重要部分

继续:所有编程语言都有权声称,程序的实际源代码是(对人)对程序所做工作的最清楚、完整和详尽的解释。Prolog绝对有权提出这一要求。这需要一点习惯,但很快一个写得好的谓词确实会告诉我们更多关于程序逻辑的信息,而不是用一种固有的模糊自然语言(无论是英语、意大利语,甚至德语)给出精确的规范/定义,这种尝试往往是徒劳的

现在谈谈你的问题

=../2
做什么?我们可以看一下,但用几句话来说,左边是
f(a,b,…,x)
,右边是
[f,a,b,…,x]

假设这里不需要解释递归、列表、匹配和统一,那么您广泛学习、用意大利语评论并用英语向我们详细解释的程序只做了一件简单的事情:术语中所有出现的子项都被术语1中的子项1替换

这已经完成了
?- substitute(x, f( g( h(x,y,z), h(k,l,m) ), g(x,z) ), q, T).
T = f(g(h(q, y, z), h(k, l, m)), g(q, z)) ;
false.