如何在序言中獲得Y和Z,當我只知道X?序言,測試(X,Y,Z): - Y是X + Z
例如:
test(X, Y, Z) :- X is Y + Z.
但錯誤:
?- test(2, Y, Z).
ERROR: is/2: Arguments are not sufficiently instantiated
如何在序言中獲得Y和Z,當我只知道X?序言,測試(X,Y,Z): - Y是X + Z
例如:
test(X, Y, Z) :- X is Y + Z.
但錯誤:
?- test(2, Y, Z).
ERROR: is/2: Arguments are not sufficiently instantiated
這是不可能的,因爲你可以選擇Y
是你想要什麼,他們計算Z
反之亦然。
但如果你知道Y
和Z
是一些有限的(如正整數小於5),你可以這樣做:
valid_number(1).
valid_number(2).
valid_number(3).
valid_number(4).
test(X, Y, Z) :- valid_number(Y), valid_number(Z), X is Y + Z.
您必須將它們作爲參數傳遞。 Prolog算術(is/2
)不是魔術棒,它的正確參數必須完全實例化(無變量)才能評估。
如果您希望謂詞在多個「方向」上工作,並且有多個基本術語和變量的組合,您將需要使用約束邏輯編程,但這是一個相當先進的邏輯編程領域。在有限域CLP,你可以說
:- use_module(library(clpfd)). % this differs between implementations
test(X,Y,Z) :- X #= Y + Z.
我第二larsmans'約束的建議,找到更容易對於初學者來說比低級模式算術更能理解。在我看來,/ 2應該從入門課程中消除,因爲初學者很難理解。 – mat 2010-12-05 13:58:54
這些設置約束也可以通過`between/3`來實現。 – 2010-12-05 15:05:05