0

私は次のプロローグ述語を理解するのにいくつかの問題を抱えています、それはいくつかの文字を連結し、可能なリスト(最初と2番目の目標)も生成することを理解できますが、これがどのように行われるのか理解できませんか?どのように実行しますか?

domains 

i=integer
l=i*
slist=string*
clist=char*

predicates 

nondeterm conc(clist,clist,clist). 

clauses 

conc([],L,L). 
conc([H|L1],L2,[H|L3]):- 
conc(L1,L2,L3).

最初の目標

goal 

conc(['a','b'],['c','d'],L).

result 

L=['a','b','c','d']

2番目の目標

goal

conc(L1,L2,['a','b','c']).

result 

L1=[], L2=['a','b','c']
L1=['a'], L2=['b','c']
L1=['a','b'], L2=['c']
L1=['a','b','c'], L2=[]
4 Solutions
4

1 に答える 1

3

私はプロローグの専門家でも論理の専門家でもありませんが、それがどのように機能するかを説明しようと思います。

呼び出し後:

<- conc(['a','b'],['c','d'],L).

Prologは、署名に一致する述語を探します。この場合、次のようになります。

conc([H|L1],L2,[H|L3])

指定されたデータで変数を解決しようとします。

 |1: H:=['a'], L1:=['b'], L2:=['c','d']

次に、これらのデータ呼び出しを使用して再帰にステップインします。

<- conc(['b'], ['c','d'], L3).
 |2: H:=['b'], L1:=[], L2:=['c','d']
<- conc([], ['c','d'], L3).

最後の行により、プロローグは署名付きの述語を使用します。

conc([],L,L).

解決:

 |3: L:=['c','d']

これで、Prologは、再帰スタックにLを渡す連結リストを作成できるようになりました。

 |2: [H|L3]:=['b','c','d']
 |1: [H|L3]:=['a','b','c','d']

それが正しい方向へのヒントになることを願っています。たぶんあなたは明確にするためにこの記事を読むべきです

于 2012-04-18T11:24:06.263 に答える