Prolog中是不是可以接受具有可变数量的谓词?

Posted

技术标签:

【中文标题】Prolog中是不是可以接受具有可变数量的谓词?【英文标题】:Is a predicate with variable arity acceptable in Prolog?Prolog中是否可以接受具有可变数量的谓词? 【发布时间】:2012-01-08 05:20:33 【问题描述】:

Prolog 中是否可以有一个“可变数量谓词”?

我的意思是这样的:

my_predicate( [a,b,c], [a,c], [a], [a,b,c,d], N, RESULT)

开始时初始列表的数量未知?

使用 univ 运算符 ( =.. ) 可以将其与术语列表统一起来,并像其他所有列表一样遍历它。但是目标怎么写呢?

my_predicate(??) =.. [??]

我真的不知道这是否可能..

【问题讨论】:

【参考方案1】:

您可以定义具有相同名称的不同参数的谓词,但它们将是不同的谓词。

foo(1).
foo(2,1).

?-foo(2).
false

我的建议是改变编码;有一个初始列表列表,而不是多个初始列表。 另一种解决方案是为所有可能数量的参数编写谓词(或动态生成它们)。

【讨论】:

我想到了,对我来说似乎更合理..但我没有写指令。 我认为文本是错误的......它的字面意思是“让我们在第一个参数处有一个带有列表列表的谓词......”。我猜我上面写的谓词文本是完全错误的。可能是作者搞错了【参考方案2】:

正如@thanosQR 建议的那样,最好将您的表示更改为某个列表。

但是,在某些情况下 - 非常罕见但仍然 - 您想要为许多不同的 arities 定义谓词。在这种非常罕见的情况下,您可以手动定义这样的谓词。也就是说,手动为每个参数。当然,您只会定义几种情况。例如,请参阅library(lambda)。

【讨论】:

【参考方案3】:

您总是可以上一级 :) 很多年前,我在 Turbo Prolog 中看到了 ANSI prolog 解释器的实现。想法非常简单,将所有用户空间事实和规则包含在一个由类似断言/撤回的操作支持的事实中。

考虑将所有目标包含在另一个 compose 中:

target(my_predicate( [a,b,c], [a,c], [a], [a,b,c,d], N, RESULT)) :- RESULT=[a], N=1.
target(H) :- H =.. [my_predicate|_].
target(using_my_predicate(X, Y)) :- target(my_predicate(X,1,Y)).

一些序言(至少是 YAP)有指令来声明未知目标的处理程序:

:- module(sumtest).

target(sum(0)).
target(H) :-
    H =.. [sum, S, X|XS],
    H1 =.. [sum, S1|XS],
    H1,
    S is (S1+X).

target(sumtest:G):- target(G). % HACK: strip-off module

:- unknown(_, target(_)).

test:-
    sum(X,1), write(X), nl,
    sum(Y,2,3), write(Y), nl,
    sum(Z,3,4,2), write(Z), nl,
    target(sum(X1,1)), write(X1), nl,
    target(sum(Y1,2,3)), write(Y1), nl,
    target(sum(Z1,3,4,2)), write(Z1), nl.


:- test, halt.
% % yap -l sumtest.pl
% YAP 6.2.0 (amd64): Thu Oct 21 10:31:27 EEST 2010
% MYDDAS version MYDDAS-0.9.1
% 1
% 5
% 9
% 1
% 5
% 9
%  % YAP execution halted

【讨论】:

感谢您的解决方案,尽管目前我无法做到 :) 有两种方法可以使用该解决方案。一种是使用指令为未知目标指定处理程序。其他的总是将目标头部包裹在附加层中(target(sum(X)) insted of just sum(X))。

以上是关于Prolog中是不是可以接受具有可变数量的谓词?的主要内容,如果未能解决你的问题,请参考以下文章

检查元素后返回列表的Prolog谓词

Prolog使用在内部谓词之间的列表

如何将用户输入转换为 gnu prolog 中的可重用谓词?

Prolog 中是不是可以进行自适应解析?

Prolog 中如何表示谓词逻辑?

Prolog谓词问题