2011-11-28 89 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