2009-11-21 14 views
7

Bir kitapta okudum ama hiç açıklanmadı. Ayrıca bir programda hiç görmedim. Prolog sözdiziminin bir parçası mı? Bu ne için? Onu kullanır mısın?Prolog'da -> operatörü nedir ve nasıl kullanabilirim?

Teşekkür

+0

Parşömen yazmak için kullanılabilir. SUM -> O1 + O2 veya somehthing ... –

+2

Bu -> (iki karaktere dikkat edin), bkz. SWI El Kitabı: http://www.swi-prolog.org/pldoc/doc_for?object=section%282 % 2c% 20% 274.12% 27% 2c% 20swi% 28% 27% 2fdoc% 2fManual% 2fDCG.html% 27 29% 29 29 – starblue

cevap

7

O ima temsil eder. Sağ taraf, sadece sol taraftaki taraf doğruysa yürütülür. Bu kodu varsa Böylece,

implication(X) :- 
    (X = a -> 
    write('Argument a received.'), nl 
    ; X = b -> 
    write('Argument b received.'), nl 
    ; 
    write('Received unknown argument.'), nl 
). 

Sonra buna argüman olarak farklı şeyler yazacak: (. link to documentation)

?- implication(a). 
Argument a received. 
true. 

?- implication(b). 
Argument b received. 
true. 

?- implication(c). 
Received unknown argument. 
true. 

+0

Eğer bir ima ise, o zaman mantıksal 'false -> false' ', aslında olmadığında. Bununla ne alakası var? –

2

Kesimin yerel versiyonu, bkz Örneğin, SWI kılavuzundaki section on control predicated. Daha çok, eğer-sonra-else (condition -> true-branch; false-branch) tarafından uygulamak için kullanılır. Durum başarılı olduğunda, gerçek daldan koşula geri dönüş veya yanlış şubeye geri dönüş yoktur, ancak eğer öyleyse geri dönme hala mümkün değildir. Bu nedenle yerel kesim veya yumuşak kesim denir.

+0

SWI'da "* ->" ile yumuşak kesim "->" değil! – mat

0

Daha endişeli bir şeyler yazarak kullanmaktan kaçınmak mümkündür.

implication(X) :- 
    (
    X = a, 
    write('Argument a received.'), nl 
    ; 
    X = b, 
    write('Argument b received.'), nl 
    ; 
    X \= a, 
    X \= b, 
    write('Received unknown argument.'), nl 
). 

(. Evet bunu kullanarak herhangi bir sorun olduğunu düşünmüyorum ama patronum nedense bu konuda paranoyak oldu, bu nedenle daima yukarıda yaklaşımı kullanılır)

: Ben Stephan's yüklemi yeniden Eğer

Her iki sürümde, özellikle de çok sayıda şubeniz varsa, kapsamayı düşündüğünüz tüm vakaları kapsadığınız konusunda dikkatli olmanız gerekir.

ETA: Bu, implication(X) varsa, geri izlemeden dolayı, Stephan'ın tamamen eşdeğer olup olmadığından emin değilim. Fakat şu anda kontrol etmek için bir Prolog yorumcüm yok.

+0

Hmm. Prolog'a çok fazla değinmiyorum, ama bu DRY ilkesini ihlal ediyor gibi görünüyor. Buna değip değmediğinden emin değil! Yani, özellikle önkoşullar biraz daha karmaşık hale gelirse, bu durum dağınık olabilir. Backtracking için: bu sürüm için (SWI-) prolog hemen “implication (a)” ve 'implication (b)' deki komut istemine geri dönmez, bu yüzden gerçekten birtakım geri dönüşler denenecektir. – Stephan202

+0

Evet, kesinlikle bunun bir alternatif olduğu söylenmez, kesinlikle bir alternatif. :) – pfctdayelise

İlgili konular