2015-10-31 70 views
1

我必須寫一個謂詞做的工作就像下面:編寫謂詞添加原子

?- cat(north,south,X). 
    X = northsouth 

    ?- cat(alley,'91',Y). 
    X = alley91 

    ?-cat(7,uthah,H). 
    Bad Input 
    H = H 

請幫助..

+0

你的謂詞寫出所需的結果,但也顯示出例如'X = X',因爲第三個參數沒有任何作用,而且你沒有使用它(因此,你的謂詞中的參數有'_'條款)。所以,貓(X,G): - ...'。另外請注意,在上次寫入後需要'nl'才能輸出新行。 – lurker

+0

我必須使它成爲三元,不能使它成爲二元。這個問題不會消失,因此請求幫助。 – ela

+0

然後不要使用'write',而是使用第三個參數作爲給定的答案。 – lurker

回答

1
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/2atom_concat/3產生了這個錯誤。

+0

謝謝。它在SWI-Prolog中工作。但在我的編譯器中,它給出的錯誤如 - 未定義謂詞:atom_chars/2。任何預定義的謂詞都不能被使用,這使得編寫這種只能使用一些基本的Prolog命令的仿函數變得複雜。請幫忙.. – ela

+0

@ela:這是什麼樣的系統?你有什麼樣的與原子相關的內建插件? – false

+0

這是NU-Prolog。我學習這門語言的來源是使用這種編譯器進行教學。我正在SWI-Prolog和NU-Prolog上試用我的代碼。許多代碼似乎在SWI-Prolog上工作,但在NU-Prolog上失敗。請幫忙.. – ela

1

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做什麼......哇,這麼簡單的謂詞,所以行爲豐富!

+1

請參閱Prolog prologue for ['append/3'](http://www.complang.tuwien.ac.at/ulrich/iso-prolog/prologue#append)。 – false

+2

'append/3' does ** not **可以使用任何實例化模式。作爲一個例子,考慮:追加(Xs,[a],Xs)'應該失敗但是循環。另外'append/3'需要第一個或最後一個參數被實例化(實際上,比這更多)。否則它不會終止。 – false

+1

@false:非常感謝... – CapelliC