2011-11-28 138 views
2

在Prolog中可能有一个“可变数据谓词”吗?Prolog中可接受的谓词是否可接受?

我的意思是这样的:

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

与开头未知初始列表的数目?

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

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

我真的不知道这甚至有可能..

回答

4

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

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

?-foo(2). 
false 

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

+0

我想到这一点,似乎对我来说更合理..但我没有写下指令。 –

+0

你能展示使用该指令的完整语法吗? – false

+0

我认为文本是错误的..它直接说“让我们有一个谓词列表在第一个参数列表......”。我猜上面写的谓词文本是完全错误的。作者可能犯了一个错误 –

4

正如@thanosQR所示,它可能是最好的将您的表示改为某个列表。

然而,尽管如此,很少有这样的情况 - 你想为许多不同的arity定义一个谓词。在这种非常罕见的情况下,您可以手动定义这样的谓词。也就是说,手动为每个元素。当然,你只会定义几个案例。例如,请参阅library(lambda)

2

你总是可以达到一个层次:)很多年前,我看到在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 
+0

谢谢你的解决方案,虽然现在已经超出我的可能:) –

+1

有两种使用这种解决方案的方法。一种是使用指令为未知目标指定处理程序。而其他总是在附加层(目标(sum(X))''只是'sum(X)'')的目标中包含目标头部。 – ony