Skip to main content

argumentation_schemes/catalog/
epistemic.rs

1//! Epistemic schemes: reasoning about knowledge and expertise.
2//!
3//! Ref: Walton, Reed & Macagno 2008, Chapter 4 + Appendix 1.
4
5use crate::catalog::EPISTEMIC_ID_OFFSET;
6use crate::critical::CriticalQuestion;
7use crate::scheme::*;
8use crate::types::*;
9
10/// Return all epistemic schemes.
11pub fn all() -> Vec<SchemeSpec> {
12    vec![
13        argument_from_expert_opinion(),
14        argument_from_witness_testimony(),
15        argument_from_position_to_know(),
16    ]
17}
18
19/// Argument from Expert Opinion (Walton 2008 p.14, Scheme 1).
20///
21/// E is an expert in domain D. E asserts that proposition A is true.
22/// Therefore, A may plausibly be taken to be true.
23pub fn argument_from_expert_opinion() -> SchemeSpec {
24    SchemeSpec {
25        id: SchemeId(EPISTEMIC_ID_OFFSET),
26        name: "Argument from Expert Opinion".into(),
27        category: SchemeCategory::Epistemic,
28        premises: vec![
29            PremiseSlot::new(
30                "expert",
31                "Source E is an expert in subject domain D",
32                SlotRole::Agent,
33            ),
34            PremiseSlot::new(
35                "domain",
36                "The field of expertise containing the claim",
37                SlotRole::Domain,
38            ),
39            PremiseSlot::new("claim", "The proposition E asserts", SlotRole::Proposition),
40        ],
41        conclusion: ConclusionTemplate::positive(
42            "?claim may plausibly be taken to be true",
43            "?claim",
44        ),
45        critical_questions: vec![
46            CriticalQuestion::new(
47                1,
48                "How credible is ?expert as an expert source?",
49                Challenge::SourceCredibility,
50            ),
51            CriticalQuestion::new(
52                2,
53                "Is ?expert an expert in the field that ?claim is in?",
54                Challenge::PremiseTruth("domain".into()),
55            ),
56            CriticalQuestion::new(
57                3,
58                "What did ?expert assert that implies ?claim?",
59                Challenge::PremiseTruth("claim".into()),
60            ),
61            CriticalQuestion::new(
62                4,
63                "Is ?expert personally reliable as a source?",
64                Challenge::SourceCredibility,
65            ),
66            CriticalQuestion::new(
67                5,
68                "Is ?claim consistent with what other experts assert?",
69                Challenge::ConflictingAuthority,
70            ),
71            CriticalQuestion::new(
72                6,
73                "Is ?expert's assertion based on evidence?",
74                Challenge::RuleValidity,
75            ),
76        ],
77        metadata: SchemeMetadata {
78            citation: "Walton 2008 p.14 (Scheme 1)".into(),
79            domain_tags: vec!["epistemic".into(), "authority".into()],
80            presumptive: true,
81            strength: SchemeStrength::Moderate,
82        },
83    }
84}
85
86/// Argument from Witness Testimony (Walton 2008 p.309, Scheme 2).
87pub fn argument_from_witness_testimony() -> SchemeSpec {
88    SchemeSpec {
89        id: SchemeId(EPISTEMIC_ID_OFFSET + 1),
90        name: "Argument from Witness Testimony".into(),
91        category: SchemeCategory::Epistemic,
92        premises: vec![
93            PremiseSlot::new(
94                "witness",
95                "The person who claims to have observed the event",
96                SlotRole::Agent,
97            ),
98            PremiseSlot::new(
99                "event",
100                "The event that was allegedly observed",
101                SlotRole::Proposition,
102            ),
103        ],
104        conclusion: ConclusionTemplate::positive("?event occurred as ?witness described", "?event"),
105        critical_questions: vec![
106            CriticalQuestion::new(
107                1,
108                "Is ?witness telling the truth (not lying)?",
109                Challenge::SourceCredibility,
110            ),
111            CriticalQuestion::new(
112                2,
113                "Was ?witness in a position to observe ?event?",
114                Challenge::PremiseTruth("witness".into()),
115            ),
116            CriticalQuestion::new(
117                3,
118                "Is ?witness's account of ?event consistent with other evidence?",
119                Challenge::ConflictingAuthority,
120            ),
121        ],
122        metadata: SchemeMetadata {
123            citation: "Walton 2008 p.309 (Scheme 2)".into(),
124            domain_tags: vec!["epistemic".into(), "testimony".into()],
125            presumptive: true,
126            strength: SchemeStrength::Moderate,
127        },
128    }
129}
130
131/// Argument from Position to Know (Walton 2008 p.310, Scheme 3).
132pub fn argument_from_position_to_know() -> SchemeSpec {
133    SchemeSpec {
134        id: SchemeId(EPISTEMIC_ID_OFFSET + 2),
135        name: "Argument from Position to Know".into(),
136        category: SchemeCategory::Epistemic,
137        premises: vec![
138            PremiseSlot::new(
139                "source",
140                "The person in a position to know",
141                SlotRole::Agent,
142            ),
143            PremiseSlot::new("domain", "The domain of knowledge", SlotRole::Domain),
144            PremiseSlot::new(
145                "claim",
146                "The asserted proposition within that domain",
147                SlotRole::Proposition,
148            ),
149        ],
150        conclusion: ConclusionTemplate::positive("?claim is plausibly true", "?claim"),
151        critical_questions: vec![
152            CriticalQuestion::new(
153                1,
154                "Is ?source in a position to know whether ?claim is true?",
155                Challenge::PremiseTruth("source".into()),
156            ),
157            CriticalQuestion::new(
158                2,
159                "Is ?source a truthful and reliable reporter?",
160                Challenge::SourceCredibility,
161            ),
162            CriticalQuestion::new(
163                3,
164                "Did ?source actually assert ?claim?",
165                Challenge::PremiseTruth("claim".into()),
166            ),
167        ],
168        metadata: SchemeMetadata {
169            citation: "Walton 2008 p.310 (Scheme 3)".into(),
170            domain_tags: vec!["epistemic".into()],
171            presumptive: true,
172            strength: SchemeStrength::Moderate,
173        },
174    }
175}
176
177#[cfg(test)]
178mod tests {
179    use super::*;
180
181    #[test]
182    fn expert_opinion_has_six_critical_questions() {
183        let scheme = argument_from_expert_opinion();
184        assert_eq!(scheme.critical_questions.len(), 6);
185        assert_eq!(scheme.premises.len(), 3);
186    }
187
188    #[test]
189    fn all_returns_three_epistemic_schemes() {
190        let schemes = all();
191        assert_eq!(schemes.len(), 3);
192        assert!(
193            schemes
194                .iter()
195                .all(|s| s.category == SchemeCategory::Epistemic)
196        );
197    }
198
199    #[test]
200    fn epistemic_ids_are_in_offset_range() {
201        for s in all() {
202            assert!(s.id.0 >= EPISTEMIC_ID_OFFSET);
203            assert!(s.id.0 < EPISTEMIC_ID_OFFSET + 100);
204        }
205    }
206}