Debugging 在条件子句中看不到Prolog变量

Debugging 在条件子句中看不到Prolog变量,debugging,prolog,Debugging,Prolog,我在Prolog中从事一个项目,偶然发现了一个问题: 假设我正在使用一个列表[H | T] function1(H,T), check(H,T,Result), Result= 'Yes' -> Stuff ; function2(H,T,NT), Stuff2... ) ; Stuff3. 我的问题是,在条件子句中,H和T变量似乎不可见(它

我在Prolog中从事一个项目,偶然发现了一个问题:

假设我正在使用一个列表
[H | T]

    function1(H,T),
    check(H,T,Result),
    Result= 'Yes' -> 
        Stuff
        ;

         function2(H,T,NT),
                     Stuff2...

    )
    ; 
    Stuff3.

我的问题是,在条件子句中,
H
T
变量似乎不可见(它们被视为新变量)。我的问题是:如何使它们可见?

按照您编写代码的方式(对省略的部分进行一些假设),您的代码被解释为

( function1(H,T),
  check(H,T,Result),
  Result= 'Yes' -> 
    Stuff
;

    function2(H,T,NT),
    Stuff2...
)
这将导致函数1在函数2执行之前被撤消。也许你想要的是

function1(H,T),
check(H,T,Result),
(  Result= 'Yes' -> 
    Stuff
;

    function2(H,T,NT),
    Stuff2...
)

逗号绑定比分号强,因此始终在if-then-else或析取周围使用括号,并确保它们具有正确的范围。

按照您编写它的方式(对省略的部分进行一些假设),您的代码被解释为

( function1(H,T),
  check(H,T,Result),
  Result= 'Yes' -> 
    Stuff
;

    function2(H,T,NT),
    Stuff2...
)
这将导致函数1在函数2执行之前被撤消。也许你想要的是

function1(H,T),
check(H,T,Result),
(  Result= 'Yes' -> 
    Stuff
;

    function2(H,T,NT),
    Stuff2...
)

逗号绑定比分号强,因此始终在if-then-else或析取之间使用括号,并确保它们具有正确的范围。

我不清楚您显示的是什么代码。这是在谓词内部吗?还有一个不平衡的括号。所示的
H
T
在您显示的序列中应该是“相同的”。你可能需要更多地解释你所看到的。你能发布一篇文章吗?或者至少是规则的负责人?我不清楚你在显示什么代码。这是在谓词内部吗?还有一个不平衡的括号。所示的
H
T
在您显示的序列中应该是“相同的”。你可能需要更多地解释你所看到的。你能发布一篇文章吗?或者至少是规则的领导者?好的接球(+1)。在第一种情况下,在不插入“if-then-else”子句的情况下,Prolog将回溯if
Result='Yes'
失败,并且在
check
生成'Yes'的
Result
之前不会执行“if”。捕捉良好(+1)。在第一种情况下,在不插入“if-then-else”子句的情况下,Prolog将回溯if
Result='Yes'
失败的情况,并且在
check
生成'Yes'的
Result
之前不会执行“if”。