我必須寫一個謂詞做的工作就像下面:編寫謂詞添加原子
?- cat(north,south,X).
X = northsouth
?- cat(alley,'91',Y).
X = alley91
?-cat(7,uthah,H).
Bad Input
H = H
請幫助..
我必須寫一個謂詞做的工作就像下面:編寫謂詞添加原子
?- cat(north,south,X).
X = northsouth
?- cat(alley,'91',Y).
X = alley91
?-cat(7,uthah,H).
Bad Input
H = H
請幫助..
atom_concat_redefined(A1, A2, A3) :-
(nonvar(A1) -> atom_chars(A1, Chs1) ; true),
(nonvar(A2) -> atom_chars(A2, Chs2) ; true),
(nonvar(A1), nonvar(A2) -> true ; atom_chars(A3, Chs3)),
append(Chs1, Chs2, Chs3),
atom_chars(A1, Chs1),
atom_chars(A2, Chs2),
atom_chars(A3, Chs3).
這個定義產生相同的錯誤,像SICStus或GNU標準一致的實現 - 不應該有其他方面的差異,除了性能。爲了比較的錯誤使用目標:
| ?- catch(atom_concat_redefined(A,B,abc+1), error(E,_), true).
E = type_error(atom,abc+1) ? ;
no
注意下劃線在error(E,_)
,其中隱藏了實現確定差異。這些實現提供了額外的信息,特別是他們會發現atom_chars/2
或atom_concat/3
產生了這個錯誤。
atom_codes/2這是ISO批准的謂詞的原子之間的轉換代碼列表。當你有兩個對應於前兩個參數的列表時,附加/ 3(alas,不是ISO認可的,但是在每個Prolog中都有AFAIK),將得到與第三個參數對應的列表,然後將該列表轉換爲原子...
請注意,儘管append/3是一個'純粹的'Prolog謂詞,並且可以與任何實例化模式一起工作,但atom_codes/2 要求至少有一個它的實例化參數。這是一個SWI-Prolog的cat/3實現,更「普遍」一點。我希望它會激發你去閱讀更多關於序言...
ac(X,Xs) :- when((ground(X);ground(Xs)), atom_codes(X,Xs)).
cat(X,Y,Z) :- maplist(ac, [X,Y,Z],[Xs,Ys,Zs]), append(Xs,Ys,Zs).
編輯
由@false我是錯的關於append/3注意到。現在,我將嘗試更好地理解附加/ 3做什麼......哇,這麼簡單的謂詞,所以行爲豐富!
你的謂詞寫出所需的結果,但也顯示出例如'X = X',因爲第三個參數沒有任何作用,而且你沒有使用它(因此,你的謂詞中的參數有'_'條款)。所以,貓(X,G): - ...'。另外請注意,在上次寫入後需要'nl'才能輸出新行。 – lurker
我必須使它成爲三元,不能使它成爲二元。這個問題不會消失,因此請求幫助。 – ela
然後不要使用'write',而是使用第三個參數作爲給定的答案。 – lurker