在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
我認爲文本是錯誤的..它直接說「讓我們有一個謂詞列表在第一個參數列表......」。我猜上面寫的謂詞文本是完全錯誤的。作者可能犯了一個錯誤 –