我正在尝试研究在无类型语言上使用自定义类型推理语言的项目的可行性。 (语言本身并不重要,但恰好是PHP)。我的第一个想法是在此上运行类型统一。我在Haskell中编写了一些程序,因此我知道类型统一是如何从最终用户的角度出发的,但我从来没有深入挖掘算法的细节。
此时,我可以解析PHP代码文件,构建一组相应的规则,并希望开始针对这些规则运行统一算法。而不是重新发明轮子,我想我会使用现有的统一算法,而AFIAK,Prolog是最强大的统一算法之一。
我现在已经到了这一点,如果我传递一个可验证的正确输入,Prolog会回复“true”。如果我传入的内容不正确,则会返回“false”。现在,我在这种情况下真正想要的是获得一条错误消息,指出为什么这些类型没有统一。如果我打开SWI-Prolog中的“跟踪”模式,我会或多或少地得到我正在寻找的东西,逐步解释为什么这些类型没有统一。我的核心问题是,是否可以通过编程方式获取此信息?我愿意写一个C扩展并直接链接到Prolog编译器,如果这是它需要的。另外,我不是以任何方式与SWI-Prolog绑定,它只是我在谷歌上发现的第一个。
另外,作为一个完整的旁边,有没有人知道prolog中的任何好的教程,无论是Web格式还是实际书籍?
答案 0 :(得分:2)
我的感觉是,通过跟踪,您无法获得详细信息 为什么统一失败,但你得到的目标信息 失败。
如果后者的信息是你想要的,你可以这样做 你可以自己设计代码。只需更换 每个目标
.. 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替换write / 1和nl / 0语句 什么适合你。这是一个例子。首先是仪表化的 Prolog文本:
?- [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.
再见