gpt4 book ai didi

prolog - 在 SWI-Prolog 中自动化我的宠物调试策略

转载 作者:行者123 更新时间:2023-12-04 08:50:24 25 4
gpt4 key购买 nike

我有一个非常简单的问题,我很乐意收到任何指导。
我正在研究定语从句语法,并且正在对其输出进行抽查。如果解析树让我感到困惑,我想将其追溯到生成树的那部分的谓词。所以我所做的是将数字原子插入到我的谓词中。像这样:sentence(sentence(Subject, Verb, Object)) --> Subject, Verb, Object.变成sentence(sentence(736, Subject, Verb, Object)) --> Subject, Verb, Object.然后我可以搜索数字 736 并检查该特定谓词以了解 Prolog 选择它的原因。随着我的语法越来越大,这变得非常方便。但是每当我想调试时都必须进行这些文本编辑很不方便。
当我想以这种方式调试时,是否有一些优雅的 Prolog 规则可以添加到语法中,一些可以附加唯一 ID 的东西?每个谓词?

最佳答案

这是高度特定于实现的,但 SWI-Prolog 有一个 source_location/2谓词,在 term_expansion/2 中调用规则,为您提供要扩展的子句的文件名和行号。
因此,您可以使用以下内容:

term_expansion(Head --> Body, EnhancedHead --> Body) :-
source_location(File, Line),
format('~w --> ~w at ~w:~w~n', [Head, Body, File, Line]),
Head =.. [Functor, Arg1 | Args],
Arg1 =.. [ArgFunctor | ArgArgs],
EnhancedArg1 =.. [ArgFunctor, File:Line | ArgArgs],
EnhancedHead =.. [Functor, EnhancedArg1 | Args].

hello -->
[world].

sentence(sentence(Subject, Verb, Object)) -->
[Subject, Verb, Object].
注意这个 term_expansion/2将为每个 -->/2 打印日志消息程序中的规则:
hello --> [world] at /home/isabelle/hello.pl:9
sentence(sentence(_2976,_2978,_2980)) --> [_2976,_2978,_2980] at /home/isabelle/hello.pl:12
但是如果规则的头部没有至少一个参数,并且第一个参数本身没有至少一个参数,那么它就会失败。这很好,失败只是意味着“不要重写这个术语”:
?- listing(hello).
hello([world|A], A).

true.

?- phrase(hello, Hello).
Hello = [world].
但是 sentence//1将被重写:
?- listing(sentence).
sentence(sentence('/home/isabelle/hello.pl':12, A, B, C), [A, B, C|D], D).

true.

?- phrase(sentence(sentence(Position, S, V, O)), [isabelle, likes, prolog]).
Position = '/home/isabelle/hello.pl':12,
S = isabelle,
V = likes,
O = prolog.
您可以在此基础上构建,也许使用单独的运算符 --->只标记那些你真正想要重写的规则。我认为,当您尝试将某些内容与实际的底层术语(而不是源代码中出现的术语)统一时,拥有这个额外的隐式参数会导致许多意外失败。
所以也许更好的方法是这样的:
sentence(sentence(@position, Subject, Verb, Object)) -->
[Subject, Verb, Object].
和相应的 term_expansion/2查找这些的规则 @position条款并相应地替换它们。

关于prolog - 在 SWI-Prolog 中自动化我的宠物调试策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64130227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com