2016-04-11 13 views
0

Bir Listenin tüm üyeleri hakkında gerçekleri prolog olarak belirtmek istiyorum ve sonuçta ortaya çıkan bir birleşme var. Bir örnek olarak, ben her liste elemanı beşe eşit olduğunu iddia istiyorum, ama aşağıda oluşumların hiçbiri yapar: Bir yol istiyorumProlog'da tüm Liste üyeleriyle ilgili gerçekleri nasıl doğrulayabilirim?

?- L=[X,Y,Z], forall(member(E,L), E=5). 

L = [_h27057686,_h27057704,_h27057722] 
X = _h27057686 
Y = _h27057704 
Z = _h27057722 
yes 

?- L=[X,Y,Z], foreach(member(E,L), E=5). 

L = [_h27057686,_h27057704,_h27057722] 
X = _h27057686 
Y = _h27057704 
Z = _h27057722 
yes 

sorgu öyle ki X=5, Y=5 poz, ve Z=5.

+1

'? - L = [X, Y, Z], maplist (= (5), L) .' – CapelliC

+0

' forall' çok mantıklı geliyor. Ne yazık ki, öyle değil. – false

+0

Bu kelimelerin genel kabul görmüş anlamında veya Prolog anlamında "assert" ve "facts" kullanıyor musunuz? Belirsizlik güçlüdür. –

cevap

2

Yanılıyor olabileceğiniz birçok terminoloji var ya da sizi yanlış anladım.

"Eşittir" ifadesi "birleştirebilir" veya "birleştir" ile aynı değildir, ancak nasıl ifade edeceğinize bağlıdır.

SWI-Prolog ile

, üst düzeyden: CapelliC tarafından açıklama zaten sonra büyük olasılıkla cevabı vardır

?- X == 5. 
false. % the free variable X is not the integer 5 

?- unifiable(X, 5, U). 
U = [X=5]. % you could unify X with 5, then X will be 5 

?- X = 5. 
X = 5. % X unifies with 5 (and is now bound to the integer 5) 

: değişkenler (serbest veya olmayarak) bir listesi verilmiş, böylece yapmak Listedeki her değişken tamsayı 5 ile sınırlıdır. Bu en iyi şekilde birleştirme ile yapılır (yukarıdaki üçüncü sorgu). maplist sadece birleştirme listenin her bir öğesine uygulanır.

PS.

Bu üç eşdeğerdir:: Eğer maplist(=(5), L) okumayı merak

maplist(=(5), [X,Y,Z]) 
maplist(=, [5,5,5], [X,Y,Z]) 
X=5, Y=5, Z=5 

Ve tabii X=5 ait

=(X,5) aynıdır.

+0

Teşekkürler, 'maplist/2' aradığım şey. @CapelliC'ye teşekkürler –

İlgili konular