Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接到prolog';s统一跟踪输出_Prolog_Unification - Fatal编程技术网

连接到prolog';s统一跟踪输出

连接到prolog';s统一跟踪输出,prolog,unification,Prolog,Unification,我试图研究在非类型语言上使用自定义类型推断语言的项目的可行性。(语言本身并不重要,但它恰好是PHP)。我的第一个想法是在此基础上运行类型统一。我用Haskell编写了一点程序,所以我从最终用户的角度知道类型统一是如何工作的,但我从来没有深入研究过算法的细节 此时,我可以解析一个PHP代码文件,建立一组相应的规则,并开始针对这些规则运行统一算法。与其重新发明轮子,我想我应该使用一个现有的统一算法,而且AFIAK,Prolog是最健壮的统一算法之一 现在我已经到了这样一个地步,如果我传入一个可验证的

我试图研究在非类型语言上使用自定义类型推断语言的项目的可行性。(语言本身并不重要,但它恰好是PHP)。我的第一个想法是在此基础上运行类型统一。我用Haskell编写了一点程序,所以我从最终用户的角度知道类型统一是如何工作的,但我从来没有深入研究过算法的细节

此时,我可以解析一个PHP代码文件,建立一组相应的规则,并开始针对这些规则运行统一算法。与其重新发明轮子,我想我应该使用一个现有的统一算法,而且AFIAK,Prolog是最健壮的统一算法之一

现在我已经到了这样一个地步,如果我传入一个可验证的正确输入,Prolog会返回“true”。如果我传入一个不正确的输入,它会返回“false”。现在我真正想要的是在该场景中得到一条错误消息,指出为什么类型没有统一。如果我在SWI Prolog中打开“跟踪”模式,我或多或少会得到我想要的,一个逐步解释为什么类型没有统一的解释。我的核心问题是,是否可以通过编程方式获取此信息?如果需要的话,我愿意编写一个C扩展并直接链接到Prolog编译器。另外,我并不以任何方式与SWI Prolog绑定,它只是我在google上找到的第一个


另外,作为一个完整的旁白,有没有人知道prolog中有什么好的教程,无论是Web格式的还是作为一本真正的书?

我的感觉是,有了trace,你就不会得到详细的信息 为什么统一失败了,但你得到的信息是哪些目标 失败

如果后面的信息是您想要的,您可以这样做 由你自己,在你仪器你的代码。替换 每个目标

 .. A ..
通过以下代码:

 .. in(A), A, out(A) ..
定义如下:

 in(A) :- write('call '), write(A), nl.
 in(A) :- write('fail '), write(A), nl, fail.

 out(A) :- write('exit '), write(A), nl.
 out(A) :- write('redo '), write(A), nl, fail.
当然,您可以将write/1和nl/0语句替换为 什么最适合你。这里有一个例子。首先是仪器化 序言文本:

?- [user].
mem(X,[X|_]).
mem(X,[_|Y]) :- in(mem(X,Y)), mem(X,Y), out(mem(X,Y)).
^D
现在是插入指令的查询:

?- in(mem(X,[1,2])), mem(X,[1,2]), out(mem(X,[1,2])).
call mem(_G1479,[1,2])
exit mem(1,[1,2])
X = 1 ;
redo mem(1,[1,2])
call mem(_G1479,[2])
exit mem(2,[2])
exit mem(2,[1,2])
X = 2 ;
redo mem(2,[1,2])
redo mem(2,[2])
call mem(_G1479,[])
fail mem(_G1479,[])
fail mem(_G1479,[2])
fail mem(_G1479,[1,2])
false.

Bye

不是
tr(目标):-in(目标)、Goal、out(目标)。
更好?tr/1不适用于剪切,至少只要您不能声明tr/1剪切透明(在Jekejeke Prolog中,您可以使用sys_noframe谓词属性)。in/1和out/1也适用于切割。但是,由于大多数Prolog系统在调试过程中都没有显示cut,这并不是一个真正的问题。这是一个简单、清晰、有效的答案,它表明我对Prolog一无所知。我想如果我这样做了,我自己会很容易意识到这一点。看来学习一种新的语言和编程风格会很有趣!事实上,我在一篇论文中看到了这一点,但现在手头没有参考资料。尽管如此,请欣赏。最有可能的是,参考书目中可能有更老、更具原创性的论文。