Prolog中是否可以接受变量arity的谓词?

时间:2011-11-28 19:21:33

标签: prolog logic

是否可以在Prolog中使用“变量arity谓词”?

我的意思是这样的:

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

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

使用univ运算符(= ..)可以将其与术语列表统一,并像其他列表一样遍历它。但是如何写出目标?

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

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

3 个答案:

答案 0 :(得分:5)

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

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

?-foo(2).
false

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

答案 1 :(得分:4)

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

然而 - 很少但很少 - 你想要为许多不同的arities定义一个谓词的情况。在极少数情况下,您可以手动定义这样的谓词。也就是说,手动为每个arity。当然,您只会定义几个案例。例如,请参阅library(lambda)

答案 2 :(得分:2)

你总能达到一个级别:)很多年前我在Turbo Prolog中看到了ANSI prolog interpter的实现。 Idea非常简单,将所有用户空间事实和规则包含在一个由assert / retract-like操作支持的单一事实中。

考虑将所有目标封闭在另一个作品中:

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