在Prolog中可能有一个“可变数据谓词”吗?Prolog中可接受的谓词是否可接受?
我的意思是这样的:
my_predicate([a,b,c], [a,c], [a], [a,b,c,d], N, RESULT)
与开头未知初始列表的数目?
使用univ
运算符(= ..)可以将它与术语列表统一起来,并像遍历其他列表一样遍历它。但是如何写出目标?
my_predicate(??) =.. [??]
我真的不知道这甚至有可能..
在Prolog中可能有一个“可变数据谓词”吗?Prolog中可接受的谓词是否可接受?
我的意思是这样的:
my_predicate([a,b,c], [a,c], [a], [a,b,c,d], N, RESULT)
与开头未知初始列表的数目?
使用univ
运算符(= ..)可以将它与术语列表统一起来,并像遍历其他列表一样遍历它。但是如何写出目标?
my_predicate(??) =.. [??]
我真的不知道这甚至有可能..
您可以定义与具有相同的名称,但他们将是不同的谓词不同arities谓词。
foo(1).
foo(2,1).
?-foo(2).
false
我的建议是改变编码;而不是一些初始列表,有一个初始列表的列表。
另一种解决方案是为所有可能的参数数量编写谓词(或动态生成它们)。
正如@thanosQR所示,它可能是最好的将您的表示改为某个列表。
然而,尽管如此,很少有这样的情况 - 你想为许多不同的arity定义一个谓词。在这种非常罕见的情况下,您可以手动定义这样的谓词。也就是说,手动为每个元素。当然,你只会定义几个案例。例如,请参阅library(lambda)。
你总是可以达到一个层次:)很多年前,我看到在Turbo Prolog中实现了ANSI prolog interpter。想法非常简单,将所有用户空间的事实和规则包含在单独的事实中,通过类似assert/retract的操作来支持。
考虑封闭在另一撰写所有的目标:
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)).
一些prologs(至少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
谢谢你的解决方案,虽然现在已经超出我的可能:) –
有两种使用这种解决方案的方法。一种是使用指令为未知目标指定处理程序。而其他总是在附加层(目标(sum(X))''只是'sum(X)'')的目标中包含目标头部。 – ony
我想到这一点,似乎对我来说更合理..但我没有写下指令。 –
你能展示使用该指令的完整语法吗? – false
我认为文本是错误的..它直接说“让我们有一个谓词列表在第一个参数列表......”。我猜上面写的谓词文本是完全错误的。作者可能犯了一个错误 –