prolog - 具有一条规则的纯 Prolog 元解释器

标签 prolog metaprogramming logical-purity prolog-metainterpreter

我想知道是否有一个纯粹的Prolog元解释器 只有一条规则。通常的 Prolog vanilla 元解释器有两个 规则。内容如下:

solve(true).
solve((A, B)) :- solve(A), solve(B). /* rule 1 */
solve(H) :- program(H, B), solve(B). /* rule 2 */

这个 Prolog vanilla 元解释器使用两个规则 /* 规则 1 *//* 规则 2 */。其余的都是事实。该程序 执行由程序事实表示。这是一个示例程序:

program(append([], X, X), true).
program(append([X|Y], Z, [X|T]), append(Y, Z, T)).
program(nrev([], []), true).
program(nrev([H|T], R), (nrev(T, S), append(S, [H], R))).

还有一个示例查询:

?- solve(nrev([1,2,3], X)).
X = [3, 2, 1] .

有没有办法将程序以不同的方式表示为事实,以及 然后编写一个不同的元解释器,它只使用事实 除了单个规则而不是两个规则?会的东西 适用于所有纯 Prolog 程序,而不仅仅是 nrev 示例?

最佳答案

这是一个想法,使用列表来保存其余的计算:

solve([]).
solve([X|Xs]) :- program(X, Ys, Xs), solve(Ys).

program(true, Xs, Xs).
program(append([],X,X), Xs, Xs).
program(append([X|Y], Z, [X|T]), [append(Y,Z,T)|Xs], Xs).
program(nrev([],[]), Xs, Xs).
program(nrev([H|T],R), [nrev(T,S),append(S,[H],R)|Xs], Xs).

通过测试调用(需要将调用包装在列表中)。

?- solve([nrev([1,2,3],X)]).
X = [3,2,1] ? ;
no

可以说,人们可以将program/3事实表示为DCG,以提高可读性(但随后它可能不再被视为“事实”)。

关于prolog - 具有一条规则的纯 Prolog 元解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65425985/

相关文章:

ruby - 向 Ruby 类添加的方法在 MiniTest 中抛出 NoMethodError

prolog - 纯 Prolog 中的目标顺序

list - 如何实现 not_all_equal/1 谓词

haskell - 有没有针对不懂 Lisp 的人的 Template Haskell 教程?

numbers - 如何手动检查Prolog中的值是否为数字?

recursion - Prolog 将分钟转换为小时

prolog - GNU Prolog 断言错误

ruby-on-rails - 如何在 Ruby on Rails 中向 Math 类动态添加方法?

list - 消除连续的重复

list - Prolog 中的子集