是否可以在Prolog中使用“变量arity谓词”?
我的意思是这样的:
my_predicate( [a,b,c], [a,c], [a], [a,b,c,d], N, RESULT)
开头时未知的初始列表数量?
使用univ
运算符(= ..)可以将其与术语列表统一,并像其他列表一样遍历它。但是如何写出目标?
my_predicate(??) =.. [??]
我真的不知道这是否可能......
答案 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