【问题标题】:Why does Prolog does not backtrack on comparison?为什么 Prolog 在比较时不回溯?
【发布时间】:2018-02-21 22:28:28
【问题描述】:

如果比较回溯,我希望以下内容总是正确的,对吧?除非它进入一个无限循环!

 ?- Y=2 , random:random(1,3,X), X =\= Y.
 Y = 2,
 X = 1.

 ?- Y=2 , random:random(1,3,X), X =\= Y.
 false. 

但我错了! 一般来说,我的问题是为什么不比较回溯?


感谢您的所有回答。我的困惑似乎主要来自我对 random 不断生成新的随机数的期望,所以我混淆了比较不是回溯,相反,原因是 random 只做了一次,之后就失败了。 我不知道某些谓词的半确定性质。 但现在我可以留意 ;) 对于这样的情况。再次感谢。

【问题讨论】:

  • 友情提示,如果您对此问题的回答令您满意,请接受该问题的答案,如果您认为答案可以改进,请要求进一步澄清

标签: prolog compare backtracking


【解决方案1】:

在您的示例中,没有什么可回溯的

您在这些示例中使用的所有谓词((=)/2random/3(=\=)/2)都是半确定性:这意味着它们要么失败,或完全成功一次

换句话说,他们都可以成功最多一次

因此,如果这些谓词中至少有一个失败,则查询失败。

要在回溯时生成一系列伪随机数,例如使用repeat/0

警告random/3 是一个不纯谓词:即使查询完全相同,它也可能产生不同的解决方案。它可能导致一次调用失败,而另一次调用成功。这会使您的代码的测试和推理变得相当复杂。

【讨论】:

  • 我明白了,这是有道理的。我不知道有不回溯的谓词。
  • 我认为这通常是一个好兆头:您显然正在对您的程序进行推理,就好像您使用的谓词是真实的关系一样。然而,并不是所有的 Prolog 谓词都是真正的关系,尤其是 random/3 不能以这种方式推理。
  • 为什么是比较semi-det。变量是否可以在回溯时用不同的值重新统一,即需要与新值进行比较?
  • 比较要么成功,要么失败,没有其他可能。如果有不同的值,它们需要来自某个地方:描述它们并在回溯时生成它们的不同谓词。但是,我建议对您的程序进行更多的声明性思考:如果您试图了解确切的执行顺序,您不会走得太远,因为它很快就会变得太复杂而难以理解。更好地思考什么是成立的,什么是应该成立的,以及事物之间的关系。
  • 比较只能失败或成功!任何重复调用必须是由于在比较之前调用的其他目标。但是,我再次建议您对代码进行更多的声明性思考:如果您尝试考虑低级细节,实际的执行策略通常太复杂而无法理解。
【解决方案2】:

Prolog 使用所谓的 Horn 子句。这意味着单独的每个术语,例如Y=2,是要回答的问题中的一个单独目标。每个目标的结果将是是或否,如果所有目标都回答是,则问题回答为是。

您的代码要求如下:

%Is Y equal to 2 or can it be made equal? 
%Yes, Y is a variable and can be assigned the numerical atom 2
Y=2 ,
%Give me a random number between 1 and 3. 
%Is X equal to the random number or can it be made equal? 
%Yes, X is a variable and can be assigned the outcome atom of random:random
random:random(1,3,X), 
%is the term contained within X NOT equivalent to Y?
X =\= Y.

您可以查看现有的比较谓词,例如 SWI documentationLearn Prolog Now!

根据您的实现,您可以使用tracewrite 输出变量中的实际原子,让您探索程序的实际工作方式。

?- trace, (Y=2 , random:random(1,3,X), write(X),nl, X =\= Y). %SWI-Prolog

SWI-prolog online editor

无限递归看起来像p(P) :- p(P).。它在答案本身内部调用了它应该解决的问题,这意味着要解决p(P),它将检查p(P),这永远不会结束。

只有在 Prolog 有选择点时才会发生回溯。选择点是决策树中的点,有多种可能的方式来满足 Prolog 当前正在处理的问题。 Prolog 从上到下工作,然后从左到右。

想想一个汽车推销员,他被问到“哪辆车最适合我?”。他有不止一辆可能的汽车可以卖给你,所以他会开始向你展示符合你标准的不同汽车。汽车需要有超过 400 升的运输能力?所有不满足此条件的汽车均不作为解决方案提供。

Prolog 进行深度优先搜索,这意味着它会深入到它找到的第一个答案,然后检查是否有其他方法来回答它。如果没有结果,答案是否定的。如果至少有一种解决方案,则答案是肯定的,并且您会得到所有可能的问题答案。这样,您只能获得满足您设定的整个目标链的结果。

【讨论】:

    【解决方案3】:

    我认为这会有所帮助。

    
    
        % Generate random value from Min to Max(with backtrack)
        rand_backtrack(Min,Max,RandVal):-
            create_list(Min,Max,List),
            randomize_list(List,Randomized),
            length(Randomized,Len),
    
        % Choose one Variable from Randomized (From first element to last). 
        % When backtrack occured, next element is chosen.
            between(1,Len,Idx),   
            nth1(Idx,Randomized,RandVal). 
    
        % create integer order list 
        % [Min,Min+1,Min+2,....,Max]
        create_list(Max,Max,[Max]):-!.
        create_list(Min,Max,[Min|Rest]):-
            Min1 is Min+1,
            create_list(Min1,Max,Rest).
    
        % shuffle List.
        % result always changes.
        % ex.randomize_list([1,2,3,4,5,6],R)     R=[4,2,6,1,3,5]
        %
        randomize_list([Val],[Val]):-!.
        randomize_list(List,[RandVal|RestRandomized]):-
            length(List,Len),
            random(1,Len,RandIdx),
            nth1(RandIdx,List,RandVal),
            select(RandVal, List, Rest),
            !,
            randomize_list(Rest,RestRandomized).
    
    
         ?- rand_backtrack(3,19,A).
        A = 6 ;
        A = 4 ;
        A = 8 ;
        A = 13 ;
        A = 15 ;
        A = 16 ;
        A = 9 ;
        A = 18 ;
        A = 7 ;
        A = 3 ;
        A = 12 ;
        A = 10 ;
        A = 17 ;
        A = 11 ;
        A = 14 ;
        A = 5 ;
        A = 19.
    
    

    【讨论】:

    • 虽然这非常非常好,您能否添加一些 cmets 来解释您在程序中实际执行的操作?我认为逻辑的目标是解释可以在许多情况下应用的普遍概念,而不是有一个单一的工作程序。例如,如果您说发动武力是错误的,那么打那些没有针对您发动武力的人是错误的。
    • 哦,对不起。我添加了简单的。
    猜你喜欢
    • 1970-01-01
    • 2018-07-07
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多